This commit is contained in:
JokoPrasetio 2026-02-26 15:29:32 +07:00
parent 7e01ccbb90
commit 2ded2e8ae8
8 changed files with 2295 additions and 13 deletions

View File

@ -1072,7 +1072,7 @@ class DashboardController extends Controller
$payload = [
'id_unit_kerja' => $id_unit_kerja,
'id_sub_unit_kerja' => $id_sub_unit_kerja,
'master_kategori_directory_id' => $master_kategori_directory_id,
'master_kategori_directory_id' => $master_kategori_directory_id ?? null,
'pegawai_id_entry' => auth()->user()->dataUser->id ?? 1,
'pegawai_nama_entry' => auth()->user()->dataUser->namalengkap ?? null,
'tanggal_terbit' => $data['date_active'] ?? null,
@ -1082,10 +1082,16 @@ class DashboardController extends Controller
'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
'action_at' => $status && $status === "approved" ? now() : null,
'is_akre' => ($data['is_akre'] ?? null) == "1"
];
$fd = FileDirectory::create($payload);
$path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}";
if($data['is_akre'] === "2"){
$path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}";
}else{
$path = "TKRS/{$data['akre_tkrs_parent']}/{$data['akre_tkrs_child']}";
}
$disk = Storage::disk('s3');
$imageName = $this->buildStoredFileName(
$fd->nama_dokumen ?? null,
@ -1412,7 +1418,8 @@ class DashboardController extends Controller
private function buildRecapData(array $unitIds, string $keyword = ''): array
{
$rows = FileDirectory::where('statusenabled', true)
->whereNotNull('status_action')
->whereNotNull('status_action')->where('status_action', 'approved')
->where('is_akre')
->whereIn('id_unit_kerja', $unitIds)
->pluck('file');
@ -1903,7 +1910,8 @@ class DashboardController extends Controller
'revision' => $item->revision,
'id_unit_kerja' => $item->id_unit_kerja,
'id_sub_unit_kerja' => $item->id_sub_unit_kerja,
'master_kategori_directory_id' => $item->master_kategori_directory_id
'master_kategori_directory_id' => $item->master_kategori_directory_id,
'is_akre' => $item->is_akre
];
});
return response()->json([
@ -2240,4 +2248,11 @@ class DashboardController extends Controller
]
]);
}
public function dataAkreditasi(){
$data = [
'title' => 'Akreditasi',
];
return view('dataAkreditasi.index', $data);
}
}

View File

@ -61,7 +61,8 @@ document.addEventListener('DOMContentLoaded', () => {
});
}
function buildRow(item){
function buildRow(item){
let tanggal = item.entry_at ? formatTanggal(item.entry_at) : '-';
let tanggalExp = item.tgl_expired ? formatTanggal(item.tgl_expired) : '-';
let tanggalTerbit = item.tanggal_terbit ? formatTanggal(item.tanggal_terbit) : '-';
@ -575,6 +576,148 @@ document.addEventListener('DOMContentLoaded', () => {
$(formCreate).find('input[type="file"]').val('');
$(formCreate).find('.file-name').addClass('d-none').text('');
}
resetAkreFields(0);
}
let akreData = [];
let akreLoaded = false;
function loadAkreData(){
if(akreLoaded) return Promise.resolve(akreData);
return fetch('/json/akreditasi.json')
.then(res => res.json())
.then(data => {
akreData = Array.isArray(data) ? data : [];
akreLoaded = true;
return akreData;
})
.catch(() => {
akreData = [];
akreLoaded = true;
return akreData;
});
}
function fillAkreType(selectEl){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Type</option>';
akreData.forEach(item => {
const opt = document.createElement('option');
opt.value = item.name;
opt.textContent = item.name;
selectEl.appendChild(opt);
});
}
function fillAkreSegment(selectEl, typeName){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Segmen</option>';
const typeItem = akreData.find(item => item.name === typeName);
if(typeItem && Array.isArray(typeItem.segment) && typeItem.segment.length){
typeItem.segment.forEach(seg => {
const opt = document.createElement('option');
opt.value = seg.name;
opt.textContent = seg.name;
selectEl.appendChild(opt);
});
selectEl.disabled = false;
selectEl.required = true;
}else{
selectEl.disabled = true;
selectEl.required = false;
}
}
function fillAkreItem(selectEl, typeName, segmentName){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Elemen</option>';
const typeItem = akreData.find(item => item.name === typeName);
const segmentItem = typeItem?.segment?.find(seg => seg.name === segmentName);
if(segmentItem && Array.isArray(segmentItem.turunan) && segmentItem.turunan.length){
segmentItem.turunan.forEach(child => {
const opt = document.createElement('option');
opt.value = child.name;
opt.textContent = child.name;
selectEl.appendChild(opt);
});
selectEl.disabled = false;
selectEl.required = true;
}else{
selectEl.disabled = true;
selectEl.required = false;
}
}
function setKategoriRequired(index, isRequired){
const katSelect = document.getElementById(`select_kategori_${index}`);
if (!katSelect) return;
if (isRequired) {
katSelect.setAttribute('required', 'required');
} else {
katSelect.removeAttribute('required');
}
}
function resetAkreFields(index){
const typeWrap = document.getElementById(`akre_type_wrap_${index}`);
const segmentWrap = document.getElementById(`akre_segment_wrap_${index}`);
const itemWrap = document.getElementById(`akre_item_wrap_${index}`);
const typeSelect = document.getElementById(`akre_type_${index}`);
const segmentSelect = document.getElementById(`akre_segment_${index}`);
const itemSelect = document.getElementById(`akre_item_${index}`);
if(typeWrap) typeWrap.classList.add('d-none');
if(segmentWrap) segmentWrap.classList.add('d-none');
if(itemWrap) itemWrap.classList.add('d-none');
if(typeSelect){
typeSelect.value = '';
typeSelect.disabled = true;
typeSelect.required = false;
}
if(segmentSelect){
segmentSelect.value = '';
segmentSelect.disabled = true;
segmentSelect.required = false;
}
if(itemSelect){
itemSelect.value = '';
itemSelect.disabled = true;
itemSelect.required = false;
}
setKategoriRequired(index, true);
}
function enableAkreFields(index){
const typeWrap = document.getElementById(`akre_type_wrap_${index}`);
const segmentWrap = document.getElementById(`akre_segment_wrap_${index}`);
const itemWrap = document.getElementById(`akre_item_wrap_${index}`);
const typeSelect = document.getElementById(`akre_type_${index}`);
const segmentSelect = document.getElementById(`akre_segment_${index}`);
const itemSelect = document.getElementById(`akre_item_${index}`);
if(typeWrap) typeWrap.classList.remove('d-none');
if(segmentWrap) segmentWrap.classList.remove('d-none');
if(itemWrap) itemWrap.classList.remove('d-none');
if(typeSelect){
typeSelect.disabled = false;
typeSelect.required = true;
}
if(segmentSelect){
segmentSelect.disabled = true;
segmentSelect.required = true;
}
if(itemSelect){
itemSelect.disabled = true;
itemSelect.required = true;
}
setKategoriRequired(index, false);
loadAkreData().then(() => {
fillAkreType(typeSelect);
if(typeSelect?.value){
fillAkreSegment(segmentSelect, typeSelect.value);
}
if(typeSelect?.value && segmentSelect?.value){
fillAkreItem(itemSelect, typeSelect.value, segmentSelect.value);
}
});
}
function selectOptionUnitKerjaV1(localCol){
@ -739,6 +882,57 @@ document.addEventListener('DOMContentLoaded', () => {
</div>
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Apakah Dokumen Akreditasi? <span class="text-danger">*</span></label>
<div class="border rounded-3 p-2 bg-light">
<div class="form-check">
<input class="form-check-input"
type="radio"
name="data[${colCount}][is_akre]"
id="akre_yes_${colCount}"
value="1"
required>
<label class="form-check-label" for="akre_yes_${colCount}">Iya</label>
</div>
<div class="form-check mt-1">
<input class="form-check-input"
type="radio"
name="data[${colCount}][is_akre]"
id="akre_no_${colCount}"
value="2"
required>
<label class="form-check-label" for="akre_no_${colCount}">Tidak</label>
</div>
</div>
</div>
<div class="col-md-4 d-none" id="akre_type_wrap_${colCount}">
<label class="form-label fw-semibold">Type Akreditasi <span class="text-danger">*</span></label>
<select class="form-select akre-type"
name="data[${colCount}][akre_type]"
id="akre_type_${colCount}"
disabled>
<option value="" disabled selected>Pilih Type</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_segment_wrap_${colCount}">
<label class="form-label fw-semibold">Segmen <span class="text-danger">*</span></label>
<select class="form-select akre-segment"
name="data[${colCount}][akre_segment]"
id="akre_segment_${colCount}"
disabled>
<option value="" disabled selected>Pilih Segmen</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_item_wrap_${colCount}">
<label class="form-label fw-semibold">Elemen Penilaian <span class="text-danger">*</span></label>
<select class="form-select akre-item"
name="data[${colCount}][akre_item]"
id="akre_item_${colCount}"
disabled>
<option value="" disabled selected>Pilih Elemen</option>
</select>
</div>
<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">
@ -754,6 +948,7 @@ document.addEventListener('DOMContentLoaded', () => {
</div>`;
col.insertAdjacentHTML('beforeend', html);
selectOptionUnitKerjaV1(colCount);
setKategoriRequired(colCount, true);
colCount++;
}
@ -816,6 +1011,41 @@ document.addEventListener('DOMContentLoaded', () => {
});
});
}
document.addEventListener('change', function(e){
if(e.target.classList.contains('akre-type')){
const id = e.target.id || '';
const idx = id.split('_').pop();
const segmentSelect = document.getElementById(`akre_segment_${idx}`);
const itemSelect = document.getElementById(`akre_item_${idx}`);
if(segmentSelect) fillAkreSegment(segmentSelect, e.target.value);
if(itemSelect){
itemSelect.innerHTML = '<option value="" disabled selected>Pilih Elemen</option>';
itemSelect.disabled = true;
}
return;
}
if(e.target.classList.contains('akre-segment')){
const id = e.target.id || '';
const idx = id.split('_').pop();
const typeSelect = document.getElementById(`akre_type_${idx}`);
const itemSelect = document.getElementById(`akre_item_${idx}`);
fillAkreItem(itemSelect, typeSelect?.value || '', e.target.value);
return;
}
if(e.target.matches('input[type="radio"][name$="[is_akre]"]')){
const name = e.target.getAttribute('name') || '';
const match = name.match(/data\[(\d+)\]\[is_akre\]/);
const idx = match ? match[1] : '0';
if(e.target.value === '1'){
enableAkreFields(idx);
}else{
resetAkreFields(idx);
}
}
});
});
document.addEventListener('click', function(e){
if(e.target.matches('.file-link')){

1765
public/json/akreditasi.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -252,8 +252,186 @@
formCreate.find('select').val(null).trigger('change');
formCreate.find('input[type="file"]').val('');
formCreate.find('.file-name').addClass('d-none').text('');
resetAkreFields(0);
}
let akreData = [];
let akreLoaded = false;
function loadAkreData(){
if(akreLoaded) return Promise.resolve(akreData);
return fetch('/json/akreditasi.json')
.then(res => res.json())
.then(data => {
akreData = Array.isArray(data) ? data : [];
akreLoaded = true;
return akreData;
})
.catch(() => {
akreData = [];
akreLoaded = true;
return akreData;
});
}
function fillAkreType(selectEl){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Type</option>';
akreData.forEach(item => {
const opt = document.createElement('option');
opt.value = item.name;
opt.textContent = item.name;
selectEl.appendChild(opt);
});
}
function fillAkreSegment(selectEl, typeName){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Segmen</option>';
const typeItem = akreData.find(item => item.name === typeName);
if(typeItem && Array.isArray(typeItem.segment) && typeItem.segment.length){
typeItem.segment.forEach(seg => {
const opt = document.createElement('option');
opt.value = seg.name;
opt.textContent = seg.name;
selectEl.appendChild(opt);
});
selectEl.disabled = false;
selectEl.required = true;
}else{
selectEl.disabled = true;
selectEl.required = false;
}
}
function fillAkreItem(selectEl, typeName, segmentName){
if(!selectEl) return;
selectEl.innerHTML = '<option value="" disabled selected>Pilih Elemen</option>';
const typeItem = akreData.find(item => item.name === typeName);
const segmentItem = typeItem?.segment?.find(seg => seg.name === segmentName);
if(segmentItem && Array.isArray(segmentItem.turunan) && segmentItem.turunan.length){
segmentItem.turunan.forEach(child => {
const opt = document.createElement('option');
opt.value = child.name;
opt.textContent = child.name;
selectEl.appendChild(opt);
});
selectEl.disabled = false;
selectEl.required = true;
}else{
selectEl.disabled = true;
selectEl.required = false;
}
}
function setKategoriRequired(index, isRequired){
const katSelect = document.getElementById(`select_kategori_${index}`);
if (!katSelect) return;
if (isRequired) {
katSelect.setAttribute('required', 'required');
} else {
katSelect.removeAttribute('required');
}
}
function resetAkreFields(index){
const typeWrap = document.getElementById(`akre_type_wrap_${index}`);
const segmentWrap = document.getElementById(`akre_segment_wrap_${index}`);
const itemWrap = document.getElementById(`akre_item_wrap_${index}`);
const typeSelect = document.getElementById(`akre_type_${index}`);
const segmentSelect = document.getElementById(`akre_segment_${index}`);
const itemSelect = document.getElementById(`akre_item_${index}`);
if(typeWrap) typeWrap.classList.add('d-none');
if(segmentWrap) segmentWrap.classList.add('d-none');
if(itemWrap) itemWrap.classList.add('d-none');
if(typeSelect){
typeSelect.value = '';
typeSelect.disabled = true;
typeSelect.required = false;
}
if(segmentSelect){
segmentSelect.value = '';
segmentSelect.disabled = true;
segmentSelect.required = false;
}
if(itemSelect){
itemSelect.value = '';
itemSelect.disabled = true;
itemSelect.required = false;
}
setKategoriRequired(index, true);
}
function enableAkreFields(index){
const typeWrap = document.getElementById(`akre_type_wrap_${index}`);
const segmentWrap = document.getElementById(`akre_segment_wrap_${index}`);
const itemWrap = document.getElementById(`akre_item_wrap_${index}`);
const typeSelect = document.getElementById(`akre_type_${index}`);
const segmentSelect = document.getElementById(`akre_segment_${index}`);
const itemSelect = document.getElementById(`akre_item_${index}`);
if(typeWrap) typeWrap.classList.remove('d-none');
if(segmentWrap) segmentWrap.classList.remove('d-none');
if(itemWrap) itemWrap.classList.remove('d-none');
if(typeSelect){
typeSelect.disabled = false;
typeSelect.required = true;
}
if(segmentSelect){
segmentSelect.disabled = true;
segmentSelect.required = true;
}
if(itemSelect){
itemSelect.disabled = true;
itemSelect.required = true;
}
setKategoriRequired(index, false);
loadAkreData().then(() => {
fillAkreType(typeSelect);
if(typeSelect?.value){
fillAkreSegment(segmentSelect, typeSelect.value);
}
if(typeSelect?.value && segmentSelect?.value){
fillAkreItem(itemSelect, typeSelect.value, segmentSelect.value);
}
});
}
document.addEventListener('change', function(e){
if(e.target.classList.contains('akre-type')){
const id = e.target.id || '';
const idx = id.split('_').pop();
const segmentSelect = document.getElementById(`akre_segment_${idx}`);
const itemSelect = document.getElementById(`akre_item_${idx}`);
if(segmentSelect) fillAkreSegment(segmentSelect, e.target.value);
if(itemSelect){
itemSelect.innerHTML = '<option value="" disabled selected>Pilih Elemen</option>';
itemSelect.disabled = true;
}
return;
}
if(e.target.classList.contains('akre-segment')){
const id = e.target.id || '';
const idx = id.split('_').pop();
const typeSelect = document.getElementById(`akre_type_${idx}`);
const itemSelect = document.getElementById(`akre_item_${idx}`);
fillAkreItem(itemSelect, typeSelect?.value || '', e.target.value);
return;
}
if(e.target.matches('input[type="radio"][name$="[is_akre]"]')){
const name = e.target.getAttribute('name') || '';
const match = name.match(/data\[(\d+)\]\[is_akre\]/);
const idx = match ? match[1] : '0';
if(e.target.value === '1'){
enableAkreFields(idx);
}else{
resetAkreFields(idx);
}
}
});
function isPublic(permissionVal){
if(permissionVal === null || permissionVal === undefined) return false;
const val = String(permissionVal).toLowerCase();
@ -733,7 +911,7 @@
type="date"
name="data[${colCount}][date_active]">
</div>
<div class="col-md-2">
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input toggle-expired"
type="checkbox"
@ -743,14 +921,14 @@
</div>
</div>
<div class="col-md-5" id="expiredField_${colCount}">
<div class="col-md-3" id="expiredField_${colCount}">
<label class="form-label fw-semibold">Tanggal Kedaluwarsa Dokumen</label>
<input class="form-control"
type="date"
name="data[${colCount}][tgl_expired]" disabled>
</div>
<div class="col-md-5">
<div class="col-md-3">
<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">
@ -776,6 +954,58 @@
</div>
</div>
<div class="col-md-3">
<label class="form-label fw-semibold">Apakah Dokumen Akreditasi? <span class="text-danger">*</span></label>
<div class="border rounded-3 p-2 bg-light">
<div class="form-check">
<input class="form-check-input"
type="radio"
name="data[${colCount}][is_akre]"
id="akre_yes_${colCount}"
value="1"
required>
<label class="form-check-label" for="akre_yes_${colCount}">Iya</label>
</div>
<div class="form-check mt-1">
<input class="form-check-input"
type="radio"
name="data[${colCount}][is_akre]"
id="akre_no_${colCount}"
value="2"
required>
<label class="form-check-label" for="akre_no_${colCount}">Tidak</label>
</div>
</div>
</div>
<div class="col-md-4 d-none" id="akre_type_wrap_${colCount}">
<label class="form-label fw-semibold">Type Akreditasi <span class="text-danger">*</span></label>
<select class="form-select akre-type"
name="data[${colCount}][akre_type]"
id="akre_type_${colCount}"
disabled>
<option value="" disabled selected>Pilih Type</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_segment_wrap_${colCount}">
<label class="form-label fw-semibold">Segmen <span class="text-danger">*</span></label>
<select class="form-select akre-segment"
name="data[${colCount}][akre_segment]"
id="akre_segment_${colCount}"
disabled>
<option value="" disabled selected>Pilih Segmen</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_item_wrap_${colCount}">
<label class="form-label fw-semibold">Elemen Penilaian <span class="text-danger">*</span></label>
<select class="form-select akre-item"
name="data[${colCount}][akre_item]"
id="akre_item_${colCount}"
disabled>
<option value="" disabled selected>Pilih Elemen</option>
</select>
</div>
<div class="col-md-12">
<label for="fileUpload_${colCount}" class="form-label fw-semibold">📂 Upload Dokumen (PDF)</label>
@ -798,6 +1028,7 @@
`;
col.append(html)
selectOptionUnitKerjaV1(colCount)
setKategoriRequired(colCount, true)
colCount++;
}

View File

@ -57,17 +57,17 @@
<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-2">
<div class="col-md-3">
<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">Masa Berlaku Dokumen?</label>
</div>
</div>
<div class="col-md-5" id="expiredField_0">
<div class="col-md-3" id="expiredField_0">
<label class="form-label fw-semibold">Tanggal Kedaluwarsa Dokumen</label>
<input class="form-control" type="date" name="data[0][tgl_expired]" disabled>
</div>
<div class="col-md-5">
<div class="col-md-3">
<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">
@ -77,7 +77,6 @@
Iya
</label>
</div>
<div class="form-check mt-1">
<input class="form-check-input" type="radio" name="data[0][is_permission]" id="perm_no" value="2" required>
<label class="form-check-label" for="perm_no">
@ -85,7 +84,42 @@
</label>
</div>
</div>
</div>
<div class="col-md-3">
<label class="form-label fw-semibold">Apakah Dokumen Akreditasi? <span class="text-danger">*</span></label>
<div class="border rounded-3 p-2 bg-light">
<div class="form-check">
<input class="form-check-input" type="radio" name="data[0][is_akre]" id="akre_yes" value="1" required>
<label class="form-check-label" for="akre_yes">
Iya
</label>
</div>
<div class="form-check mt-1">
<input class="form-check-input" type="radio" name="data[0][is_akre]" id="akre_no" value="2" required>
<label class="form-check-label" for="akre_no">
Tidak
</label>
</div>
</div>
</div>
<div class="col-md-4 d-none" id="akre_type_wrap_0">
<label class="form-label fw-semibold">Type Akreditasi <span class="text-danger">*</span></label>
<select class="form-select akre-type" name="data[0][akre_type]" id="akre_type_0" disabled>
<option value="" disabled selected>Pilih Type</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_segment_wrap_0">
<label class="form-label fw-semibold">Segmen <span class="text-danger">*</span></label>
<select class="form-select akre-segment" name="data[0][akre_segment]" id="akre_segment_0" disabled>
<option value="" disabled selected>Pilih Segmen</option>
</select>
</div>
<div class="col-md-4 d-none" id="akre_item_wrap_0">
<label class="form-label fw-semibold">Elemen Penilaian <span class="text-danger">*</span></label>
<select class="form-select akre-item" name="data[0][akre_item]" id="akre_item_0" disabled>
<option value="" disabled selected>Pilih Elemen</option>
</select>
</div>
<div class="col-md-12 mb-2">

View File

@ -41,6 +41,12 @@
<span class="hide-menu">Dokumen Umum</span>
</a>
</li>
<li class="sidebar-item">
<a class="sidebar-link" href="{{ url('/data-akreditasi') }}" aria-expanded="false">
<i class="ti ti-layout-dashboard"></i>
<span class="hide-menu">Dokumen Akreditasi</span>
</a>
</li>
{{-- AKTIVITAS --}}
<li class="nav-small-cap"><span class="hide-menu">Aktivitas</span></li>

View File

@ -16,6 +16,7 @@ Route::middleware(['auth'])->group(function(){
Route::get('/download-excel/data-unit', [DashboardController::class, 'downloadDataUnitExcel']);
Route::get('/data-umum', [DashboardController::class, 'dataUmum']);
Route::get('/datatable-umum', [DashboardController::class, 'datatableDataUmum']);
Route::get('/data-akreditasi', [DashboardController::class, 'dataAkreditasi']);
Route::get('/download-excel/data-umum', [DashboardController::class, 'downloadDataUmumExcel']);
Route::post('/uploadv2', [DashboardController::class, 'storeVersion2']);
Route::get('/file-preview/{id}', [DashboardController::class, 'dataPdf']);