feat(memo): tambah tombol download PDF dan disable checkbox untuk memo selesai

- Menambahkan field memo_penyelesaian_pdf_path ke tabel noc untuk menyimpan path file PDF
- Membuat migrasi baru untuk menambahkan field PDF path ke tabel noc
- Menambahkan field memo_penyelesaian_pdf_path ke model Noc dalam fillable array
- Memodifikasi fungsi generatePdf di MemoController untuk menyimpan path PDF ke database
- Menambahkan route baru memo.download-pdf untuk download file PDF memo penyelesaian
- Membuat method downloadPdf di MemoController dengan validasi file dan error handling
- Memodifikasi kolom select di datatables untuk disable checkbox jika sudah ada memo
- Menambahkan tooltip pada checkbox yang disabled untuk memberikan informasi kepada user
- Memodifikasi kolom actions untuk menampilkan tombol download PDF jika memo sudah ada
- Menampilkan informasi nomor memo dan tanggal memo di kolom actions
- Memodifikasi fungsi handleCheckboxChange untuk mengabaikan checkbox yang disabled
- Menambahkan styling untuk tombol download dengan icon dan warna yang sesuai
- Menambahkan logging untuk tracking aktivitas download PDF memo penyelesaian
- Menambahkan validasi keberadaan file di storage sebelum mengizinkan download
- Menggunakan Storage facade untuk operasi file yang lebih aman dan konsisten
This commit is contained in:
Daeng Deni Mardaeni
2025-07-17 13:47:53 +07:00
parent 57dece449c
commit 4459b70271
4 changed files with 77 additions and 13 deletions

View File

@@ -54,6 +54,10 @@
<span class="sort"> <span class="sort-label"> AO </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_penilaian_id">
<span class="sort"> <span class="sort-label"> Jenis Penilaian </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian_id">
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span>
<span class="sort-icon"> </span> </span>
@@ -134,11 +138,21 @@
columns: {
select: {
render: (item, data, context) => {
// Cek apakah sudah ada memo penyelesaian
const hasMemo = data.noc && data.noc.memo_penyelesaian;
const checkbox = document.createElement('input');
checkbox.className = 'checkbox checkbox-sm';
checkbox.type = 'checkbox';
checkbox.value = data.id.toString();
checkbox.setAttribute('data-datatable-row-check', 'true');
// Disable checkbox jika sudah ada memo
if (hasMemo) {
checkbox.disabled = true;
checkbox.title = 'Permohonan ini sudah memiliki memo penyelesaian';
}
return checkbox.outerHTML.trim();
},
},
@@ -166,6 +180,12 @@
return `${data.user.name}`;
},
},
jenis_penilaian_id: {
title: 'Jenis Penilaian',
render: (item, data) => {
return `${data.jenis_penilaian.name}`;
}
},
tujuan_penilaian_id: {
title: 'Tujuan Penilaian',
render: (item, data) => {
@@ -252,9 +272,21 @@
render: (item, data) => {
let actionButtons = '';
actionButtons = `
// Cek apakah sudah ada memo penyelesaian dengan PDF
if (data.noc && data.noc.memo_penyelesaian) {
actionButtons = `
<div class="flex flex-col gap-1">
<a href="memo/memo/download-pdf/${data.id}"
class="flex gap-1 items-center btn btn-sm btn-primary"
title="Download PDF Memo Penyelesaian">
<i class="fas fa-download"></i>
Download Memo
</a>
</div>`;
} else {
actionButtons = `
<span class="text-sm text-gray-500">Belum ada memo</span>`;
}
return `<div class="flex flex-wrap gap-1.5 justify-center">${actionButtons}</div>`;
},
@@ -268,7 +300,8 @@
* Fungsi untuk menangani perubahan checkbox
*/
function handleCheckboxChange() {
const checkboxes = document.querySelectorAll('input[data-datatable-row-check="true"]:checked');
// Hanya ambil checkbox yang tidak disabled dan checked
const checkboxes = document.querySelectorAll('input[data-datatable-row-check="true"]:checked:not(:disabled)');
selectedItems = Array.from(checkboxes).map(cb => cb.value);
// Enable/disable tombol create memo berdasarkan jumlah item yang dipilih