function renderTree(units, katDok, keyword) { if (!Array.isArray(units)) return ''; return ` `; } function index(kategori_dok = [], unitKerja = null, subUnitKerja = [], klasifikasi_id = [], keyword = '') { const params = new URLSearchParams(); if (kategori_dok.length) params.append("kategori", kategori_dok); if (unitKerja) params.append("unitKerja", unitKerja); if (subUnitKerja.length) params.append("subUnit", subUnitKerja); if (klasifikasi_id.length) params.append("klasifikasi", klasifikasi_id); if (keyword) params.append("keyword", keyword); fetch(`/data-unit-kerja?${params.toString()}`) .then(response => response.json()) .then(data => { let file_tree = document.getElementById("file_tree"); file_tree.innerHTML = ''; if (Array.isArray(data?.data?.unitKerja)) { file_tree.innerHTML = renderTree(data.data.unitKerja, data.data.katDok, keyword); // Toggle buka/tutup folder file_tree.querySelectorAll(".folder > span").forEach(span => { span.addEventListener("click", () => { let li = span.parentElement; li.classList.toggle("collapsed"); // Ganti ikon ๐Ÿ“‚ <-> ๐Ÿ“ if (li.classList.contains("collapsed")) { span.textContent = span.textContent.replace("๐Ÿ“‚", "๐Ÿ“"); } else { span.textContent = span.textContent.replace("๐Ÿ“", "๐Ÿ“‚"); } }); }); } else { file_tree.innerHTML = `

Silakan lakukan pencarian terlebih dahulu untuk menampilkan data

`; } }) .catch(error => console.error('Error : ', error)); } index(); function referesh(){ index() } function searchData(){ let klasifikasi_id = $("#klasifikasi_dok").val() let kategori_dok = $("#kategori_dok").val() let unitKerja = $("#unit_kerja").val() let subUnitKerja = $("#sub_unit_kerja").val() if(klasifikasi_id.length === 0 || kategori_dok.length === 0 || subUnitKerja.length === 0){ Swal.fire({ text: 'Lengkapi Isi form pencarian', icon: 'warning' }) return } index(kategori_dok, unitKerja, subUnitKerja, klasifikasi_id); } let debounceTimer; function debounceSearch(input) { clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { searchFile(input.value.trim()); }, 300); } function searchFile(keyword){ let klasifikasi_id = $("#klasifikasi_dok").val() let kategori_dok = $("#kategori_dok").val() let unitKerja = $("#unit_kerja").val() let subUnitKerja = $("#sub_unit_kerja").val() index(kategori_dok, unitKerja, subUnitKerja, klasifikasi_id, keyword); } function download(e){ let data = $(e).data(); let id = data?.id; let type = data?.part; fetch('/download-byfolder', { method:'POST', headers: { 'Content-Type' : 'application/json', 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, }, body: JSON.stringify({ id : id, type: type}) }) .then(async res => { if (!res.ok) { // 4xx/5xx const msg = await res.json().catch(() => ({message:'Server error'})); throw new Error(msg.message || 'Gagal membuat arsip'); } return res.blob(); }) .then(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `files_${Date.now()}.zip`; document.body.appendChild(a).click(); document.body.removeChild(a); URL.revokeObjectURL(url); }) .catch(err => { Swal.fire({ icon: 'error', title : 'Gagal mengunduh' }) }) } let multiIds = []; $(document).on('change', 'input[data-select]', function () { const type = $(this).data('select'); const isChecked = this.checked; /* 1. Auto-check semua sub-unit bila UNIT di-check */ if (type === 'unit') { $(this).closest('li.file-tree-li') .find('input[data-select="sub_unit"]') .prop('checked', isChecked) .each(function () { const su_id = $(this).data('sub_unit_id'); const key = `${$(this).data('unit_id')}-${su_id}`; const idx = multiIds.findIndex(x => x.key === key); if (isChecked && idx === -1) multiIds.push({ key, unit_id: $(this).data('unit_id'), sub_unit_id: su_id }); if (!isChecked && idx !== -1) multiIds.splice(idx, 1); }); } /* 2. Auto-uncheck UNIT bila sisa satu SUB-UNIT di-uncheck */ if (type === 'sub_unit' && !isChecked) { const $unitLi = $(this).closest('li.file-tree-li').closest('ul').closest('li.file-tree-li'); const $unitCheck = $unitLi.children('input[data-select="unit"]'); const stillChecked= $unitLi.find('input[data-select="sub_unit"]:checked').length > 0; if (!stillChecked) $unitCheck.prop('checked', false).trigger('change'); } /* ---------- sisanya tetap: push/pop multiIds ---------- */ const unit_id = $(this).data('unit_id'); const sub_unit_id = $(this).data('sub_unit_id'); const key = `${unit_id}-${sub_unit_id}`; const idx = multiIds.findIndex(x => x.key === key); if (isChecked && idx === -1) multiIds.push({ key, unit_id, sub_unit_id }); if (!isChecked && idx !== -1) multiIds.splice(idx, 1); $('#multi-count').text(multiIds.length); $('#btn-download-multi').prop('disabled', multiIds.length === 0); }); function refreshMultiButton(){ $("#multi-count").text(multiIds.length) $("#btn-download-multi").prop('disable', multiIds.length === 0) } function downloadMultiple(){ if(multiIds.length === 0) return; fetch('/download-multiple', { method:'POST', headers: { 'Content-Type' : 'application/json', 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, }, body: JSON.stringify({ ids : multiIds}) }) .then(async res => { if (!res.ok) { // 4xx/5xx const msg = await res.json().catch(() => ({message:'Server error'})); throw new Error(msg.message || 'Gagal membuat arsip'); } return res.blob(); }) .then(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `files_${Date.now()}.zip`; document.body.appendChild(a).click(); document.body.removeChild(a); URL.revokeObjectURL(url); }) .catch(err => { Swal.fire({ icon: 'error', title : 'Gagal mengunduh' }) }) }