feat(sync-logs): tambahkan fitur download file CSV

- Tambahkan tombol download file di modal detail sinkronisasi.
- Implementasikan pengecekan dan mekanisme download file di `SyncLogsController`.
- Tambahkan route baru untuk mendukung proses download file.
- Perbarui tampilan dan logika modal untuk mendukung fitur download.
- Pastikan validasi file sebelum proses download dan berikan pesan error jika file tidak ditemukan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
Daeng Deni Mardaeni
2025-05-10 15:36:16 +07:00
parent e1e52f78fb
commit e1a0167c78
3 changed files with 54 additions and 5 deletions

View File

@@ -1,4 +1,3 @@
@extends('layouts.main')
@section('breadcrumbs')
@@ -168,8 +167,15 @@
</div>
</div>
</div>
<div class="modal-footer">
<a href="#" id="btn-download-file" class="btn btn-success btn-sm me-3 hidden">
<i class="ki-outline ki-file-down me-1"></i> Download File
</a>
<button type="button" class="btn btn-light" data-modal-dismiss="true">Tutup</button>
</div>
</div>
</div>
@endsection
@push('scripts')
@@ -180,7 +186,7 @@
const filterCsv = document.getElementById('filter-csv');
const filterFtp = document.getElementById('filter-ftp');
const detailModal = document.getElementById('detail-modal');
console.log(detailModal);
const btnDownloadFile = document.getElementById('btn-download-file');
const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = {
@@ -250,6 +256,14 @@
actions += `<button class="btn btn-sm btn-icon btn-light btn-detail" data-id="${data.id}">
<i class="ki-outline ki-eye fs-3"></i>
</button>`;
if (data.is_csv && data.file_name) {
actions += `<a href="{{ url('sync-logs/download') }}/${data.id}" class="btn btn-sm btn-icon btn-success" title="Download File">
<i class="ki-outline ki-file-down fs-3"></i>
</a>`;
}
actions += `</div>`;
return actions;
},
@@ -287,7 +301,7 @@
filterFtp.addEventListener('change', applyFilters);
// Detail modal functionality
document.addEventListener('click', function(e) {
document.addEventListener('click', function (e) {
if (e.target.closest('.btn-detail')) {
const id = e.target.closest('.btn-detail').getAttribute('data-id');
@@ -295,7 +309,13 @@
fetch(`{{ url('sync-logs') }}/${id}`)
.then(response => response.json())
.then(data => {
console.log(data);
if (data.is_csv && data.file_name) {
btnDownloadFile.classList.remove('hidden');
btnDownloadFile.href = `{{ url('sync-logs/download') }}/${data.id}`;
} else {
btnDownloadFile.classList.add('hidden');
}
// Populate modal with data
document.getElementById('detail-periode').textContent = data.periode;
document.getElementById('detail-total-records').textContent = data.total_records;
@@ -329,7 +349,6 @@
document.getElementById('detail-ftp-notes').textContent = data.ftp_notes || '-';
// Show modal
const modalEl = KTDom.getElement('#detail-modal');
const modal = KTModal.getInstance(modalEl);
modal.show();