Compare commits
3 Commits
ecc950f19d
...
6ab9aada1f
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ab9aada1f | |||
| 73d48d5499 | |||
| 20d88e8823 |
@ -453,14 +453,45 @@ class DashboardController extends Controller
|
||||
|
||||
public function downloadDataMultiple(){
|
||||
try {
|
||||
$rows = request('ids', []); // [[unit_id=>u, sub_unit_id=>s], ...]
|
||||
$rows = request('ids', []); // [[file_directory_id=>x] | [sub_unit_id=>y] | "file_directory_id", ...]
|
||||
if (empty($rows)) {
|
||||
return response()->json(['message' => 'Tidak ada data'], 422);
|
||||
}
|
||||
$paths = [];
|
||||
foreach ($rows as $r) {
|
||||
if(!empty($r['sub_unit_id'])){
|
||||
$files = FileDirectory::where('id_sub_unit_kerja', $r['sub_unit_id'])->where('statusenabled', true)->where('status_action', 'approved')->pluck('file');
|
||||
if (is_string($r) || is_numeric($r)) {
|
||||
$file = FileDirectory::where('file_directory_id', $r)
|
||||
->where('statusenabled', true)
|
||||
->where('status_action', 'approved')
|
||||
->value('file');
|
||||
if ($file) {
|
||||
$paths[] = $file;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!empty($r['file_directory_id'] ?? null)) {
|
||||
$file = FileDirectory::where('file_directory_id', $r['file_directory_id'])
|
||||
->where('statusenabled', true)
|
||||
->where('status_action', 'approved')
|
||||
->value('file');
|
||||
if ($file) {
|
||||
$paths[] = $file;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!empty($r['file'] ?? null)) {
|
||||
$paths[] = $r['file'];
|
||||
continue;
|
||||
}
|
||||
|
||||
$subUnitId = $r['sub_unit_id'] ?? $r['id_sub_unit_kerja'] ?? null;
|
||||
if (!empty($subUnitId)) {
|
||||
$files = FileDirectory::where('id_sub_unit_kerja', $subUnitId)
|
||||
->where('statusenabled', true)
|
||||
->where('status_action', 'approved')
|
||||
->pluck('file');
|
||||
|
||||
$paths = array_merge($paths, $files->toArray());
|
||||
}
|
||||
@ -631,14 +662,13 @@ class DashboardController extends Controller
|
||||
}
|
||||
|
||||
|
||||
$status = null;
|
||||
if(auth()->user()->masterPersetujuan){
|
||||
// if(auth()->user()->masterPersetujuan){
|
||||
// $unitPegawaiIds = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray();
|
||||
// $status = in_array($id_unit_kerja, $unitPegawaiIds)
|
||||
// ? 'approved'
|
||||
// : null;
|
||||
$status = $isAtasan ? 'approved' : null;
|
||||
}
|
||||
// }
|
||||
|
||||
$payload = [
|
||||
'id_unit_kerja' => $id_unit_kerja,
|
||||
@ -648,12 +678,13 @@ class DashboardController extends Controller
|
||||
'pegawai_nama_entry' => auth()->user()->dataUser->namalengkap ?? null,
|
||||
'tanggal_terbit' => $data['date_active'] ?? null,
|
||||
'no_dokumen' => $data['no_dokumen'] ?? null,
|
||||
'nama_dokumen' => $data['nama_dokumen'] ?? null,
|
||||
'tgl_expired' => $data['tgl_expired'] ?? null,
|
||||
'permission_file' => ($data['is_permission'] ?? null) == "1",
|
||||
'status_action' => $status,
|
||||
'action_by' => $status && $status === "approved" ? auth()->user()->objectpegawaifk : null,
|
||||
'action_at' => $status && $status === "approved" ? now() : null
|
||||
];
|
||||
|
||||
$imageName = $uploadedFile->getClientOriginalName();
|
||||
$path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}";
|
||||
$uploadedFile->storeAs($path, $imageName, 'file_directory');
|
||||
@ -669,8 +700,8 @@ class DashboardController extends Controller
|
||||
'text_notifikasi' => "Dokumen {$docNumber} memerlukan persetujuan. Diunggah oleh {$uploaderName}.",
|
||||
'url' => '/pending-file',
|
||||
'is_read' => false,
|
||||
// 'pegawai_id' => $mapping?->objectatasanlangsungfk,
|
||||
'pegawai_id' => 23521,
|
||||
'pegawai_id' => $mapping?->objectatasanlangsungfk,
|
||||
// 'pegawai_id' => 23521,
|
||||
];
|
||||
|
||||
Notifkasi::create($payloadNotification);
|
||||
@ -680,7 +711,8 @@ class DashboardController extends Controller
|
||||
DB::connection('dbDirectory')->commit();
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Data berhasil disimpan'
|
||||
'message' => 'Data berhasil disimpan',
|
||||
'status_action' => $isAtasan ? 'approved' : null
|
||||
], 200);
|
||||
} catch (\Throwable $th) {
|
||||
DB::connection('dbDirectory')->rollback();
|
||||
@ -974,15 +1006,17 @@ class DashboardController extends Controller
|
||||
// ->orWhereNull('status_action');
|
||||
// })->whereIn('id_unit_kerja', $authUnit)->orderBy('entry_at','desc');
|
||||
$mapping = MappingUnitKerjaPegawai::where('statusenabled', true)
|
||||
// ->where('objectatasanlangsungfk', auth()->user()->dataUser->id)
|
||||
->where('objectatasanlangsungfk', 22924)
|
||||
->where('objectatasanlangsungfk', auth()->user()->dataUser->id)
|
||||
// ->where('objectatasanlangsungfk', 22924)
|
||||
->get(['objectpegawaifk']);
|
||||
$objectpegawaifk = $mapping->pluck('objectpegawaifk')
|
||||
->values()
|
||||
->all();
|
||||
$keyword = request('keyword');
|
||||
$query = FileDirectory::where('statusenabled', true)
|
||||
->where('status_action', '!=', 'approved')
|
||||
->where(function($qsa){
|
||||
$qsa->where('status_action', '!=', 'approved')->orWhereNull('status_action');
|
||||
})
|
||||
->whereIn('pegawai_id_entry', $objectpegawaifk)
|
||||
->when($keyword, function ($q) use ($keyword) {
|
||||
$q->where(function ($sub) use ($keyword) {
|
||||
@ -1412,8 +1446,8 @@ class DashboardController extends Controller
|
||||
'text_notifikasi' => "Dokumen {$docNumber} telah direvisi dan memerlukan persetujuan ulang. ". "Direvisi oleh {$uploaderName}.",
|
||||
'url' => '/pending-file',
|
||||
'is_read' => false,
|
||||
// 'pegawai_id' => $mapping?->objectatasanlangsungfk,
|
||||
'pegawai_id' => 23521,
|
||||
'pegawai_id' => $mapping?->objectatasanlangsungfk,
|
||||
// 'pegawai_id' => 23521,
|
||||
];
|
||||
|
||||
Notifkasi::create($payloadNotification);
|
||||
|
||||
@ -63,6 +63,7 @@ class LogActivityController extends Controller
|
||||
'sub_unit' => $parts[1],
|
||||
'kategori' => $parts[2],
|
||||
'entry_at' => $item->entry_at,
|
||||
'pengunggah' => $item->pegawai_nama_entry,
|
||||
'total_views' => $item->total_views ?? 0,
|
||||
];
|
||||
});
|
||||
|
||||
@ -45,6 +45,13 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (status === 'revised') return '<span class="badge bg-info">Revised</span>';
|
||||
return '<span class="badge bg-warning text-dark">Pending</span>';
|
||||
}
|
||||
function aksesBadge(akses){
|
||||
if (akses){
|
||||
return '<span class="badge bg-success">Umum</span>';
|
||||
} else{
|
||||
return '<span class="badge bg-primary">Internal Unit</span>';
|
||||
}
|
||||
}
|
||||
|
||||
function safeText(val){
|
||||
return val ? String(val) : '-';
|
||||
@ -67,6 +74,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
<td>${item?.status_action !== "rejected" ? aksi : ''}</td>
|
||||
<td>${safeText(item.no_dokumen)}</td>
|
||||
<td>${statusBadge(item?.status_action)}</td>
|
||||
<td>${aksesBadge(item?.permission_file)}</td>
|
||||
<td><a href="#" class="file-link"
|
||||
data-file="${item.file}"
|
||||
data-fileName="${item.fileName}"
|
||||
@ -127,7 +135,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (pageData.length === 0) {
|
||||
tbody.innerHTML = `
|
||||
<tr>
|
||||
<td colspan="8" class="text-center text-muted py-4">
|
||||
<td colspan="9" class="text-center text-muted py-4">
|
||||
Tidak ada data
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
<div class="mt-2 text-success fw-semibold d-none file-name"></div>
|
||||
</div>
|
||||
<div class="form-text text-muted">
|
||||
Bisa upload lebih dari 1 file. Format yang didukung: <b>PDF</b>.
|
||||
Format yang didukung: <b>PDF</b>.
|
||||
</div>
|
||||
</div>
|
||||
<div id="col_add_file" class="col-12"></div>
|
||||
|
||||
@ -120,9 +120,39 @@
|
||||
<div class="card-body p-3">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade show active">
|
||||
<div class="d-flex flex-column flex-md-row align-items-md-center gap-2 mb-3">
|
||||
<h4 class="mb-0">Data Unit</h4>
|
||||
<button type="button" class="btn btn-success ms-md-auto" data-bs-target="#modalCreateFile" data-bs-toggle="modal">Tambah File</button>
|
||||
<div class="d-flex justify-content-between align-items-start mb-3">
|
||||
<h4 class="mb-0">Data Umum</h4>
|
||||
<div class="d-flex align-items-start gap-3">
|
||||
<!-- DOWNLOAD + COUNT -->
|
||||
<div class="d-flex flex-column align-items-start">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm"
|
||||
id="btnDownloadMultiple"
|
||||
disabled
|
||||
>
|
||||
<i class="ti ti-download me-1"></i>
|
||||
Download Terpilih
|
||||
</button>
|
||||
|
||||
<span
|
||||
id="selectedCount"
|
||||
class="small text-muted mt-1"
|
||||
>
|
||||
0 dipilih
|
||||
</span>
|
||||
</div>
|
||||
<!-- TAMBAH FILE -->
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-success btn-sm"
|
||||
data-bs-toggle="modal"
|
||||
data-bs-target="#modalCreateFile"
|
||||
>
|
||||
<i class="ti ti-plus me-1"></i>
|
||||
Tambah File
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column flex-md-row align-items-md-center gap-2 mb-3">
|
||||
<div class="input-group input-group-sm flex-grow-1">
|
||||
@ -150,11 +180,13 @@
|
||||
<table class="table table-sm table-hover align-middle mb-0 table-fixed" id="lastUpdatedTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nomor Surat</th>
|
||||
<th>File</th>
|
||||
<th class="text-center" style="width: 36px;">
|
||||
<input type="checkbox" id="checkAllRows" class="form-check-input">
|
||||
</th>
|
||||
<th>No Dokumen</th>
|
||||
<th>Nama Dokumen</th>
|
||||
<th>Kategori</th>
|
||||
<th>Unit</th>
|
||||
<th>Sub Unit </th>
|
||||
<th>Tanggal Upload</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -185,6 +217,25 @@
|
||||
const paginationEl = document.getElementById('paginationControls');
|
||||
const summaryEl = document.getElementById('tableSummary');
|
||||
const pageSizeSelect = document.getElementById('tablePageSize');
|
||||
const downloadBtn = document.getElementById('btnDownloadMultiple');
|
||||
const selectedCountEl = document.getElementById('selectedCount');
|
||||
const checkAllEl = document.getElementById('checkAllRows');
|
||||
const selectedIds = new Set();
|
||||
|
||||
document.addEventListener('change', function(e){
|
||||
if(!e.target.classList.contains('toggle-expired')) return;
|
||||
const targetId = e.target.getAttribute('data-target');
|
||||
if(!targetId) return;
|
||||
const fieldWrap = document.getElementById(targetId);
|
||||
if(!fieldWrap) return;
|
||||
if(e.target.checked){
|
||||
fieldWrap.classList.remove('d-none');
|
||||
}else{
|
||||
fieldWrap.classList.add('d-none');
|
||||
const input = fieldWrap.querySelector('input[type="date"]');
|
||||
if(input) input.value = '';
|
||||
}
|
||||
});
|
||||
|
||||
if(pageSizeSelect){
|
||||
const initialSize = parseInt(pageSizeSelect.value);
|
||||
@ -232,8 +283,15 @@
|
||||
statusLabel = 'Internal Unit';
|
||||
statusClass = 'bg-secondary';
|
||||
}
|
||||
const checked = selectedIds.has(String(item.file_directory_id)) ? 'checked' : '';
|
||||
return `
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="form-check-input row-check"
|
||||
data-id="${item.file_directory_id}"
|
||||
${checked}>
|
||||
</td>
|
||||
<td class="text-nowrap">${item.no_dokumen || '-'}</td>
|
||||
<td class="file-cell">
|
||||
<div style="display:flex; flex-direction:column; gap:4px;">
|
||||
@ -246,7 +304,7 @@
|
||||
<a href="#"
|
||||
class="file-link ${statusLabel === "Pending" ? 'file-pending' : ''}"
|
||||
data-file="${item.file}"
|
||||
data-fileName="${fileName}"
|
||||
data-fileName="${item.nama_dokumen || '-'}"
|
||||
data-id="${item.file_directory_id}"
|
||||
data-no_dokumen="${item.no_dokumen || '-'}"
|
||||
data-tanggal_terbit="${item.tanggal_terbit || '-'}"
|
||||
@ -259,49 +317,10 @@
|
||||
word-break:break-word;
|
||||
"
|
||||
>
|
||||
${fileName}
|
||||
${item.nama_dokumen || '-'}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- BARIS BAWAH (LABEL) -->
|
||||
<div style="padding-left:24px;">
|
||||
|
||||
${
|
||||
item.permission_file
|
||||
? `
|
||||
<span style="
|
||||
display:inline-block;
|
||||
padding:2px 10px;
|
||||
font-size:11px;
|
||||
border-radius:6px;
|
||||
background:#ecfdf5;
|
||||
color:#047857;
|
||||
border:1px solid #a7f3d0;
|
||||
font-weight:500;
|
||||
cursor:default;
|
||||
">
|
||||
Umum
|
||||
</span>
|
||||
`
|
||||
: `
|
||||
<span style="
|
||||
display:inline-block;
|
||||
padding:2px 10px;
|
||||
font-size:11px;
|
||||
border-radius:6px;
|
||||
background:#eff6ff;
|
||||
color:#1d4ed8;
|
||||
border:1px solid #bfdbfe;
|
||||
font-weight:500;
|
||||
cursor:default;
|
||||
">
|
||||
Internal Unit
|
||||
</span>
|
||||
`
|
||||
}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
|
||||
@ -311,9 +330,6 @@
|
||||
<td>
|
||||
${unitName}
|
||||
</td>
|
||||
<td>
|
||||
${subName}
|
||||
</td>
|
||||
<td class="text-nowrap">${formatTanggal(item.entry_at)}</td>
|
||||
</tr>
|
||||
`;
|
||||
@ -368,7 +384,7 @@
|
||||
if(pageData.length === 0){
|
||||
tbody.innerHTML = `
|
||||
<tr>
|
||||
<td colspan="5" class="text-center text-muted py-4">
|
||||
<td colspan="7" class="text-center text-muted py-4">
|
||||
Tidak ada data yang cocok
|
||||
</td>
|
||||
</tr>
|
||||
@ -384,6 +400,8 @@
|
||||
}
|
||||
|
||||
renderPagination(tableState.lastPage || 1);
|
||||
syncCheckAllState();
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function debouncedTableSearch(value){
|
||||
@ -429,6 +447,99 @@
|
||||
}
|
||||
fetchData()
|
||||
|
||||
function updateSelectedCount(){
|
||||
if(!selectedCountEl) return;
|
||||
selectedCountEl.textContent = `${selectedIds.size} dipilih`;
|
||||
if(downloadBtn){
|
||||
downloadBtn.disabled = selectedIds.size === 0;
|
||||
}
|
||||
}
|
||||
|
||||
function syncCheckAllState(){
|
||||
if(!checkAllEl) return;
|
||||
const pageIds = (tableState.data || []).map(item => String(item.file_directory_id));
|
||||
if(pageIds.length === 0){
|
||||
checkAllEl.checked = false;
|
||||
checkAllEl.indeterminate = false;
|
||||
return;
|
||||
}
|
||||
const selectedOnPage = pageIds.filter(id => selectedIds.has(id)).length;
|
||||
checkAllEl.checked = selectedOnPage === pageIds.length;
|
||||
checkAllEl.indeterminate = selectedOnPage > 0 && selectedOnPage < pageIds.length;
|
||||
}
|
||||
|
||||
if(checkAllEl){
|
||||
checkAllEl.addEventListener('change', function(){
|
||||
const pageIds = (tableState.data || []).map(item => String(item.file_directory_id));
|
||||
if(this.checked){
|
||||
pageIds.forEach(id => selectedIds.add(id));
|
||||
}else{
|
||||
pageIds.forEach(id => selectedIds.delete(id));
|
||||
}
|
||||
renderTable();
|
||||
});
|
||||
}
|
||||
|
||||
if(tbody){
|
||||
tbody.addEventListener('change', function(e){
|
||||
const checkbox = e.target.closest('.row-check');
|
||||
if(!checkbox) return;
|
||||
const id = String(checkbox.getAttribute('data-id'));
|
||||
if(checkbox.checked){
|
||||
selectedIds.add(id);
|
||||
}else{
|
||||
selectedIds.delete(id);
|
||||
}
|
||||
syncCheckAllState();
|
||||
updateSelectedCount();
|
||||
});
|
||||
}
|
||||
|
||||
if(downloadBtn){
|
||||
downloadBtn.addEventListener('click', function(){
|
||||
if(selectedIds.size === 0){
|
||||
return;
|
||||
}
|
||||
const payload = { ids: Array.from(selectedIds) };
|
||||
downloadBtn.disabled = true;
|
||||
downloadBtn.textContent = 'Menyiapkan...';
|
||||
fetch('/download-multiple', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
},
|
||||
body: JSON.stringify(payload)
|
||||
})
|
||||
.then(async (res) => {
|
||||
const contentType = res.headers.get('content-type') || '';
|
||||
if(!res.ok || contentType.includes('application/json')){
|
||||
const err = await res.json().catch(() => ({}));
|
||||
throw new Error(err?.message || 'Gagal download file');
|
||||
}
|
||||
const blob = await res.blob();
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
const disposition = res.headers.get('content-disposition') || '';
|
||||
const match = disposition.match(/filename="?([^"]+)"?/);
|
||||
a.href = url;
|
||||
a.download = match?.[1] || 'files.zip';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
window.URL.revokeObjectURL(url);
|
||||
})
|
||||
.catch(err => {
|
||||
Swal.fire({ icon: 'error', title: 'Gagal', text: err.message || 'Gagal download file' });
|
||||
})
|
||||
.finally(() => {
|
||||
downloadBtn.disabled = selectedIds.size === 0;
|
||||
downloadBtn.textContent = 'Download Terpilih';
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('click', function (e) {
|
||||
const btn = e.target.closest('.folder-prefill');
|
||||
if (!btn) return;
|
||||
@ -591,7 +702,7 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nomor Dokumen</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">#</span>
|
||||
@ -600,18 +711,35 @@
|
||||
name="data[${colCount}][no_dokumen]"
|
||||
placeholder="Contoh: 001/RS/IT/I/2026">
|
||||
</div>
|
||||
<div class="form-text text-muted">Opsional, isi jika ada nomor resmi dokumen.</div>
|
||||
<div class="form-text text-muted"></div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nama Dokumen</label>
|
||||
<input type="text" class="form-control"
|
||||
name="data[${colCount}][nama_dokumen]"
|
||||
placeholder="Contoh: 001/RS/IT/I/2026">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Tanggal Terbit</label>
|
||||
<input class="form-control"
|
||||
type="date"
|
||||
name="data[${colCount}][date_active]"
|
||||
required>
|
||||
name="data[${colCount}][date_active]">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input toggle-expired"
|
||||
type="checkbox"
|
||||
id="hasExpired_${colCount}"
|
||||
data-target="expiredField_${colCount}">
|
||||
<label class="form-check-label" for="hasExpired_${colCount}">Ada Expired?</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5 d-none" id="expiredField_${colCount}">
|
||||
<label class="form-label fw-semibold">Tanggal Expired</label>
|
||||
<input class="form-control" type="date" name="data[${colCount}][tgl_expired]">
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<label class="form-label fw-semibold">Boleh dilihat unit lain? <span class="text-danger">*</span></label>
|
||||
|
||||
<div class="border rounded-3 p-2 bg-light">
|
||||
@ -640,7 +768,6 @@
|
||||
|
||||
<div class="col-md-12">
|
||||
<label for="fileUpload_${colCount}" class="form-label fw-semibold">📂 Upload Dokumen (PDF)</label>
|
||||
|
||||
<div class="border rounded-3 p-3 bg-white shadow-sm">
|
||||
<input class="form-control"
|
||||
type="file"
|
||||
@ -846,11 +973,26 @@
|
||||
color: "#fff",
|
||||
}
|
||||
}).showToast();
|
||||
const modalInstance = bootstrap.Modal.getInstance(modalCreate);
|
||||
modalInstance?.hide();
|
||||
resetCreateForm();
|
||||
fetchData()
|
||||
submitBtn.prop('disabled', false).text('Simpan')
|
||||
const modalInstance = bootstrap.Modal.getInstance(modalCreate);
|
||||
modalInstance?.hide();
|
||||
if(responseData.status_action === null || responseData.status_action === undefined){
|
||||
Swal.fire({
|
||||
icon: 'info',
|
||||
title: 'Perlu Persetujuan',
|
||||
text: 'Dokumen yang Anda upload butuh persetujuan dari atasan. Untuk melihatnya, kunjungi halaman Pengajuan File atau klik Tutup untuk tetap di sini.',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: 'Ke Pengajuan File',
|
||||
cancelButtonText: 'Tutup'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
window.location.href = '/pengajuan-file';
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.');
|
||||
}
|
||||
|
||||
@ -14,39 +14,61 @@
|
||||
<div class="modal-body">
|
||||
<div class="container" style="max-height: 70vh; overflow-y:auto;">
|
||||
<div class="row g-3">
|
||||
<div class="col-12">
|
||||
<div class="p-2 rounded-3 bg-light border">
|
||||
<span class="fw-semibold">Informasi Dokumen</span>
|
||||
<div class="small text-muted">Lengkapi detail dokumen sebelum upload.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Unit <span class="text-danger">*</span></label>
|
||||
<select class="form-control unit_kerja" name="data[0][id_unit_kerja]" id="select_id_unit_kerja_0" required>
|
||||
<option value="" disable>Select Choose</option>
|
||||
<option value="" disable>Pilih Unit</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Sub Unit <span class="text-danger">*</span></label>
|
||||
<select class="form-control" name="data[0][id_sub_unit_kerja]" id="select_id_sub_unit_kerja_0" required>
|
||||
<option value="" disable selected>Select Choose</option>
|
||||
<option value="" disable selected>Pilih Sub Unit</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Kategori Dokumen <span class="text-danger">*</span></label>
|
||||
<select class="form-control" name="data[0][master_kategori_directory_id]" id="select_kategori_0" required>
|
||||
<option value="" disable>Select Choose</option>
|
||||
<option value="" disable>Pilih Kategori</option>
|
||||
@foreach ($katDok as $kat)
|
||||
<option value="{{ $kat->master_kategori_directory_id }}/{{ $kat->nama_kategori_directory }}">{{ $kat->nama_kategori_directory }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nomor Dokumen</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">#</span>
|
||||
<input type="text" class="form-control" name="data[0][no_dokumen]" placeholder="Contoh: 001/RS/IT/I/2026">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nama Dokumen</label>
|
||||
<input type="text" class="form-control" name="data[0][nama_dokumen]" placeholder="Contoh: Panduan Mencuci Tangan">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Tanggal Terbit</label>
|
||||
<input class="form-control" type="date" name="data[0][date_active]">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input toggle-expired" type="checkbox" id="hasExpired0" data-target="expiredField_0">
|
||||
<label class="form-check-label" for="hasExpired0">Ada Expired?</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5 d-none" id="expiredField_0">
|
||||
<label class="form-label fw-semibold">Tanggal Expired</label>
|
||||
<input class="form-control" type="date" name="data[0][tgl_expired]">
|
||||
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<label class="form-label fw-semibold">Boleh dilihat unit lain? <span class="text-danger">*</span></label>
|
||||
|
||||
<div class="border rounded-3 p-2 bg-light">
|
||||
@ -64,6 +86,7 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mb-2">
|
||||
@ -73,7 +96,7 @@
|
||||
<div class="mt-2 text-success fw-semibold d-none file-name"></div>
|
||||
</div>
|
||||
<div class="form-text text-muted">
|
||||
Bisa upload lebih dari 1 file. Format yang didukung: <b>PDF</b>.
|
||||
Format yang didukung: <b>PDF</b>.
|
||||
</div>
|
||||
</div>
|
||||
<div id="col_add_fileV2" class="col-12"></div>
|
||||
|
||||
@ -129,7 +129,7 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link d-flex align-items-center gap-2" data-bs-toggle="tab" href="#tab-data-recap" role="tab" aria-controls="tab-data-recap" aria-selected="false">
|
||||
<i class="ti ti-chart-bar"></i>
|
||||
<span>Data Recap</span>
|
||||
<span>Data Rekap</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@ -138,9 +138,39 @@
|
||||
<div class="card-body p-3">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade show active" id="tab-data-unit" role="tabpanel">
|
||||
<div class="d-flex flex-column flex-md-row align-items-md-center gap-2 mb-3">
|
||||
<div class="d-flex justify-content-between align-items-start mb-3">
|
||||
<h4 class="mb-0">Data Unit</h4>
|
||||
<button type="button" class="btn btn-success ms-md-auto" data-bs-target="#modalCreateFile" data-bs-toggle="modal">Tambah File</button>
|
||||
<div class="d-flex align-items-start gap-3">
|
||||
<!-- DOWNLOAD + COUNT -->
|
||||
<div class="d-flex flex-column align-items-start">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm"
|
||||
id="btnDownloadMultiple"
|
||||
disabled
|
||||
>
|
||||
<i class="ti ti-download me-1"></i>
|
||||
Download Terpilih
|
||||
</button>
|
||||
|
||||
<span
|
||||
id="selectedCount"
|
||||
class="small text-muted mt-1"
|
||||
>
|
||||
0 dipilih
|
||||
</span>
|
||||
</div>
|
||||
<!-- TAMBAH FILE -->
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-success btn-sm"
|
||||
data-bs-toggle="modal"
|
||||
data-bs-target="#modalCreateFile"
|
||||
>
|
||||
<i class="ti ti-plus me-1"></i>
|
||||
Tambah File
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column flex-md-row align-items-md-center gap-2 mb-3">
|
||||
<div class="input-group input-group-sm flex-grow-1">
|
||||
@ -162,18 +192,22 @@
|
||||
<option value="100">100</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="small text-muted ms-md-auto" id="tableSummary">Memuat data...</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="max-height: 70vh; overflow-y:auto;">
|
||||
<table class="table table-sm table-hover align-middle mb-0 table-fixed" id="lastUpdatedTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nomor Surat</th>
|
||||
<th>File</th>
|
||||
<th class="text-center" style="width: 36px;">
|
||||
<input type="checkbox" id="checkAllRows" class="form-check-input">
|
||||
</th>
|
||||
<th>No Dokumen</th>
|
||||
<th>Nama Dokumen</th>
|
||||
<th>Kategori</th>
|
||||
<th>Unit</th>
|
||||
<th>Sub Unit </th>
|
||||
<th>Tanggal Upload</th>
|
||||
<th>Pengunggah</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableDataUnit">
|
||||
@ -206,6 +240,25 @@
|
||||
const paginationEl = document.getElementById('paginationControls');
|
||||
const summaryEl = document.getElementById('tableSummary');
|
||||
const pageSizeSelect = document.getElementById('tablePageSize');
|
||||
const downloadBtn = document.getElementById('btnDownloadMultiple');
|
||||
const selectedCountEl = document.getElementById('selectedCount');
|
||||
const checkAllEl = document.getElementById('checkAllRows');
|
||||
const selectedIds = new Set();
|
||||
|
||||
document.addEventListener('change', function(e){
|
||||
if(!e.target.classList.contains('toggle-expired')) return;
|
||||
const targetId = e.target.getAttribute('data-target');
|
||||
if(!targetId) return;
|
||||
const fieldWrap = document.getElementById(targetId);
|
||||
if(!fieldWrap) return;
|
||||
if(e.target.checked){
|
||||
fieldWrap.classList.remove('d-none');
|
||||
}else{
|
||||
fieldWrap.classList.add('d-none');
|
||||
const input = fieldWrap.querySelector('input[type="date"]');
|
||||
if(input) input.value = '';
|
||||
}
|
||||
});
|
||||
|
||||
if(pageSizeSelect){
|
||||
const initialSize = parseInt(pageSizeSelect.value);
|
||||
@ -253,8 +306,15 @@
|
||||
statusLabel = 'Internal Unit';
|
||||
statusClass = 'bg-secondary';
|
||||
}
|
||||
const checked = selectedIds.has(String(item.file_directory_id)) ? 'checked' : '';
|
||||
return `
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="form-check-input row-check"
|
||||
data-id="${item.file_directory_id}"
|
||||
${checked}>
|
||||
</td>
|
||||
<td class="text-nowrap">${item.no_dokumen || '-'}</td>
|
||||
<td class="file-cell">
|
||||
<div class="file-title">
|
||||
@ -262,13 +322,13 @@
|
||||
<a href="#"
|
||||
class="file-link ${statusLabel === "Pending" ? 'file-pending' : ''}"
|
||||
data-file="${item.file}"
|
||||
data-fileName="${fileName}"
|
||||
data-fileName="${item.nama_dokumen || '-'}"
|
||||
data-id="${item.file_directory_id}"
|
||||
data-no_dokumen="${item.no_dokumen || '-'}"
|
||||
data-tanggal_terbit="${item.tanggal_terbit || '-'}"
|
||||
data-permission_file="${item.permission_file || '-'}"
|
||||
>
|
||||
${fileName}
|
||||
${item.nama_dokumen || '-'}
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
@ -278,10 +338,8 @@
|
||||
<td>
|
||||
${unitName}
|
||||
</td>
|
||||
<td>
|
||||
${subName}
|
||||
</td>
|
||||
<td class="text-nowrap">${formatTanggal(item.entry_at)}</td>
|
||||
<td class="text-nowrap">${item.pegawai_nama_entry || '-'}</td>
|
||||
</tr>
|
||||
`;
|
||||
}
|
||||
@ -335,7 +393,7 @@
|
||||
if(pageData.length === 0){
|
||||
tbody.innerHTML = `
|
||||
<tr>
|
||||
<td colspan="5" class="text-center text-muted py-4">
|
||||
<td colspan="7" class="text-center text-muted py-4">
|
||||
Tidak ada data yang cocok
|
||||
</td>
|
||||
</tr>
|
||||
@ -351,6 +409,8 @@
|
||||
}
|
||||
|
||||
renderPagination(tableState.lastPage || 1);
|
||||
syncCheckAllState();
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function debouncedTableSearch(value){
|
||||
@ -396,6 +456,99 @@
|
||||
}
|
||||
fetchData()
|
||||
|
||||
function updateSelectedCount(){
|
||||
if(!selectedCountEl) return;
|
||||
selectedCountEl.textContent = `${selectedIds.size} dipilih`;
|
||||
if(downloadBtn){
|
||||
downloadBtn.disabled = selectedIds.size === 0;
|
||||
}
|
||||
}
|
||||
|
||||
function syncCheckAllState(){
|
||||
if(!checkAllEl) return;
|
||||
const pageIds = (tableState.data || []).map(item => String(item.file_directory_id));
|
||||
if(pageIds.length === 0){
|
||||
checkAllEl.checked = false;
|
||||
checkAllEl.indeterminate = false;
|
||||
return;
|
||||
}
|
||||
const selectedOnPage = pageIds.filter(id => selectedIds.has(id)).length;
|
||||
checkAllEl.checked = selectedOnPage === pageIds.length;
|
||||
checkAllEl.indeterminate = selectedOnPage > 0 && selectedOnPage < pageIds.length;
|
||||
}
|
||||
|
||||
if(checkAllEl){
|
||||
checkAllEl.addEventListener('change', function(){
|
||||
const pageIds = (tableState.data || []).map(item => String(item.file_directory_id));
|
||||
if(this.checked){
|
||||
pageIds.forEach(id => selectedIds.add(id));
|
||||
}else{
|
||||
pageIds.forEach(id => selectedIds.delete(id));
|
||||
}
|
||||
renderTable();
|
||||
});
|
||||
}
|
||||
|
||||
if(tbody){
|
||||
tbody.addEventListener('change', function(e){
|
||||
const checkbox = e.target.closest('.row-check');
|
||||
if(!checkbox) return;
|
||||
const id = String(checkbox.getAttribute('data-id'));
|
||||
if(checkbox.checked){
|
||||
selectedIds.add(id);
|
||||
}else{
|
||||
selectedIds.delete(id);
|
||||
}
|
||||
syncCheckAllState();
|
||||
updateSelectedCount();
|
||||
});
|
||||
}
|
||||
|
||||
if(downloadBtn){
|
||||
downloadBtn.addEventListener('click', function(){
|
||||
if(selectedIds.size === 0){
|
||||
return;
|
||||
}
|
||||
const payload = { ids: Array.from(selectedIds) };
|
||||
downloadBtn.disabled = true;
|
||||
downloadBtn.textContent = 'Menyiapkan...';
|
||||
fetch('/download-multiple', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
},
|
||||
body: JSON.stringify(payload)
|
||||
})
|
||||
.then(async (res) => {
|
||||
const contentType = res.headers.get('content-type') || '';
|
||||
if(!res.ok || contentType.includes('application/json')){
|
||||
const err = await res.json().catch(() => ({}));
|
||||
throw new Error(err?.message || 'Gagal download file');
|
||||
}
|
||||
const blob = await res.blob();
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
const disposition = res.headers.get('content-disposition') || '';
|
||||
const match = disposition.match(/filename="?([^"]+)"?/);
|
||||
a.href = url;
|
||||
a.download = match?.[1] || 'files.zip';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
window.URL.revokeObjectURL(url);
|
||||
})
|
||||
.catch(err => {
|
||||
Swal.fire({ icon: 'error', title: 'Gagal', text: err.message || 'Gagal download file' });
|
||||
})
|
||||
.finally(() => {
|
||||
downloadBtn.disabled = selectedIds.size === 0;
|
||||
downloadBtn.textContent = 'Download Terpilih';
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('click', function (e) {
|
||||
const btn = e.target.closest('.folder-prefill');
|
||||
if (!btn) return;
|
||||
@ -558,7 +711,7 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nomor Dokumen</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">#</span>
|
||||
@ -567,18 +720,40 @@
|
||||
name="data[${colCount}][no_dokumen]"
|
||||
placeholder="Contoh: 001/RS/IT/I/2026">
|
||||
</div>
|
||||
<div class="form-text text-muted">Opsional, isi jika ada nomor resmi dokumen.</div>
|
||||
<div class="form-text text-muted"></div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nama Dokumen</label>
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
name="data[${colCount}][nama_dokumen]"
|
||||
placeholder="Contoh: Panduan Mencuci Tangan">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Tanggal Terbit</label>
|
||||
<input class="form-control"
|
||||
type="date"
|
||||
name="data[${colCount}][date_active]"
|
||||
required>
|
||||
name="data[${colCount}][date_active]">
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input toggle-expired"
|
||||
type="checkbox"
|
||||
id="hasExpired_${colCount}"
|
||||
data-target="expiredField_${colCount}">
|
||||
<label class="form-check-label" for="hasExpired_${colCount}">Ada Expired?</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-5 d-none" id="expiredField_${colCount}">
|
||||
<label class="form-label fw-semibold">Tanggal Expired</label>
|
||||
<input class="form-control"
|
||||
type="date"
|
||||
name="data[${colCount}][tgl_expired]">
|
||||
</div>
|
||||
|
||||
<div class="col-md-5">
|
||||
<label class="form-label fw-semibold">Boleh dilihat unit lain? <span class="text-danger">*</span></label>
|
||||
|
||||
<div class="border rounded-3 p-2 bg-light">
|
||||
@ -813,11 +988,26 @@
|
||||
color: "#fff",
|
||||
}
|
||||
}).showToast();
|
||||
const modalInstance = bootstrap.Modal.getInstance(modalCreate);
|
||||
modalInstance?.hide();
|
||||
resetCreateForm();
|
||||
fetchData()
|
||||
submitBtn.prop('disabled', false).text('Simpan')
|
||||
const modalInstance = bootstrap.Modal.getInstance(modalCreate);
|
||||
modalInstance?.hide();
|
||||
if(responseData.status_action === null || responseData.status_action === undefined){
|
||||
Swal.fire({
|
||||
icon: 'info',
|
||||
title: 'Perlu Persetujuan',
|
||||
text: 'Dokumen yang Anda upload butuh persetujuan dari atasan. Untuk melihatnya, kunjungi halaman Pengajuan File atau klik Tutup untuk tetap di sini.',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: 'Ke Pengajuan File',
|
||||
cancelButtonText: 'Tutup'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
window.location.href = '/pengajuan-file';
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.');
|
||||
}
|
||||
|
||||
@ -14,39 +14,61 @@
|
||||
<div class="modal-body">
|
||||
<div class="container" style="max-height: 70vh; overflow-y:auto;">
|
||||
<div class="row g-3">
|
||||
<div class="col-12">
|
||||
<div class="p-2 rounded-3 bg-light border">
|
||||
<span class="fw-semibold">Informasi Dokumen</span>
|
||||
<div class="small text-muted">Lengkapi detail dokumen sebelum upload.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Unit <span class="text-danger">*</span></label>
|
||||
<select class="form-control unit_kerja" name="data[0][id_unit_kerja]" id="select_id_unit_kerja_0" required>
|
||||
<option value="" disable>Select Choose</option>
|
||||
<option value="" disable>Pilih Unit</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Sub Unit <span class="text-danger">*</span></label>
|
||||
<select class="form-control" name="data[0][id_sub_unit_kerja]" id="select_id_sub_unit_kerja_0" required>
|
||||
<option value="" disable selected>Select Choose</option>
|
||||
<option value="" disable selected>Pilih Sub Unit</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Kategori Dokumen <span class="text-danger">*</span></label>
|
||||
<select class="form-control" name="data[0][master_kategori_directory_id]" id="select_kategori_0" required>
|
||||
<option value="" disable>Select Choose</option>
|
||||
<option value="" disable>Pilih Kategori</option>
|
||||
@foreach ($katDok as $kat)
|
||||
<option value="{{ $kat->master_kategori_directory_id }}/{{ $kat->nama_kategori_directory }}">{{ $kat->nama_kategori_directory }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nomor Dokumen</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">#</span>
|
||||
<input type="text" class="form-control" name="data[0][no_dokumen]" placeholder="Contoh: 001/RS/IT/I/2026">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Nama Dokumen</label>
|
||||
<input type="text" class="form-control" name="data[0][nama_dokumen]" placeholder="Contoh: Panduan Mencuci Tangan">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-semibold">Tanggal Terbit</label>
|
||||
<input class="form-control" type="date" name="data[0][date_active]">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input toggle-expired" type="checkbox" id="hasExpired0" data-target="expiredField_0">
|
||||
<label class="form-check-label" for="hasExpired0">Ada Expired?</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5 d-none" id="expiredField_0">
|
||||
<label class="form-label fw-semibold">Tanggal Expired</label>
|
||||
<input class="form-control" type="date" name="data[0][tgl_expired]">
|
||||
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<label class="form-label fw-semibold">Boleh dilihat unit lain? <span class="text-danger">*</span></label>
|
||||
|
||||
<div class="border rounded-3 p-2 bg-light">
|
||||
@ -64,6 +86,7 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mb-2">
|
||||
@ -73,7 +96,7 @@
|
||||
<div class="mt-2 text-success fw-semibold d-none file-name"></div>
|
||||
</div>
|
||||
<div class="form-text text-muted">
|
||||
Bisa upload lebih dari 1 file. Format yang didukung: <b>PDF</b>.
|
||||
Format yang didukung: <b>PDF</b>.
|
||||
</div>
|
||||
</div>
|
||||
<div id="col_add_fileV2" class="col-12"></div>
|
||||
|
||||
@ -57,7 +57,7 @@
|
||||
@php
|
||||
$isAtasan = \App\Models\MappingUnitKerjaPegawai::where('statusenabled', true)->where('objectatasanlangsungfk', auth()->user()->objectpegawaifk)->exists();
|
||||
@endphp
|
||||
@if($isAtasan || auth()->user()->objectpegawaifk === 23521)
|
||||
@if($isAtasan)
|
||||
<li class="sidebar-item">
|
||||
<a class="sidebar-link d-flex align-items-center justify-content-between"
|
||||
href="{{ url('/pending-file') }}" aria-expanded="false">
|
||||
@ -116,11 +116,11 @@
|
||||
</a>
|
||||
|
||||
<ul class="collapse sidebar-submenu {{ $openMaster ? 'show' : '' }}" id="menu-master">
|
||||
<li class="sidebar-item">
|
||||
{{-- <li class="sidebar-item">
|
||||
<a href="{{ url('/akses') }}" class="sidebar-link">
|
||||
<span class="hide-menu">Akses</span>
|
||||
</a>
|
||||
</li>
|
||||
</li> --}}
|
||||
|
||||
<li class="sidebar-item">
|
||||
<a href="{{ url('/master-kategori') }}" class="sidebar-link">
|
||||
@ -128,11 +128,11 @@
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="sidebar-item">
|
||||
{{-- <li class="sidebar-item">
|
||||
<a href="{{ url('/master-persetujuan') }}" class="sidebar-link">
|
||||
<span class="hide-menu">Persetujuan</span>
|
||||
</a>
|
||||
</li>
|
||||
</li> --}}
|
||||
</ul>
|
||||
</li>
|
||||
@endif
|
||||
@ -198,7 +198,7 @@
|
||||
|
||||
countData();
|
||||
|
||||
setInterval(countData, 60000);
|
||||
// setInterval(countData, 60000);
|
||||
|
||||
const masterCollapse = document.getElementById('menu-master');
|
||||
const masterItem = masterCollapse
|
||||
|
||||
@ -49,6 +49,7 @@
|
||||
<th>Kategori</th>
|
||||
<th>Unit</th>
|
||||
<th>Sub Unit</th>
|
||||
<th>Pengunggah</th>
|
||||
<th class="text-center">Jumlah Pegawai Melihat</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -105,6 +106,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
<td>${item.kategori || '-'}</td>
|
||||
<td>${item.unit || '-'}</td>
|
||||
<td>${item.sub_unit || '-'}</td>
|
||||
<td>${item.pengunggah || '-'}</td>
|
||||
<td class="text-center fw-semibold">${totalViews}</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
@ -47,6 +47,7 @@
|
||||
<th>Aksi</th>
|
||||
<th>No. Dokumen</th>
|
||||
<th>Status</th>
|
||||
<th>Akses</th>
|
||||
<th>File</th>
|
||||
<th>Folder</th>
|
||||
<th>Unit / Sub Unit</th>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user