diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 0e6283b..b09025b 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -62,7 +62,12 @@ class DashboardController extends Controller ->when($subArray, fn($q) => $q->whereIn('id_sub_unit_kerja', $subArray)) ->when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray)) ->when($klaArray, fn($q) => $q->whereIn('master_klasifikasi_directory_id', $klaArray)) - ->when($keyword, fn($q) => $q->where('file', 'ilike', "%{$keyword}%")->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%")) + ->when($keyword, fn($q) => + $q->where(function($query) use ($keyword) { + $query->where('file', 'ilike', "%{$keyword}%") + ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + }) + ) ]) ]) ->select('id', 'name') @@ -87,8 +92,10 @@ class DashboardController extends Controller ->with([ // muat relasi 'subUnitKerja' => fn($q) => $q->with([ // sub-unit 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => - $q->where('file', 'ilike', "%{$keyword}%") - ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%") + $q->where(function($query) use ($keyword) { + $query->where('file', 'ilike', "%{$keyword}%") + ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + }) ) ]) ]) @@ -106,7 +113,10 @@ class DashboardController extends Controller 'subUnitKerja' => fn($q) => $q->where('id', $authSub) ->with([ // 2. file-directory + filter keyword 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => - $q->where('file', 'like', "%{$keyword}%")->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%") + $q->where(function($query) use ($keyword) { + $query->where('file', 'ilike', "%{$keyword}%") + ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + }) ) ]) ]) @@ -130,26 +140,30 @@ class DashboardController extends Controller $datas = request()->input('data'); $result = []; foreach($datas as $index => $value){ - $file = request()->file("data.$index.file"); - list($id_unit_kerja, $nama_unit_kerja) = explode('/', $value['id_unit_kerja'],2); - list($id_sub_unit_kerja, $nama_sub_unit_kerja) = explode('/', $value['id_sub_unit_kerja'],2); - list($master_kategori_directory_id, $nama_kategori) = explode('/', $value['master_kategori_directory_id'],2); - list($klasifikasi, $nama_klasifikasi) = explode('/', $value['klasifikasi'],2); - $payload = [ - 'master_klasifikasi_directory_id' => $klasifikasi, - 'id_unit_kerja' => $id_unit_kerja, - 'id_sub_unit_kerja' => $id_sub_unit_kerja, - 'master_kategori_directory_id' => $master_kategori_directory_id, - 'pegawai_id_entry' => auth()->user()->id ?? 1, - 'pegawai_nama_entry' => auth()->user()->namalengkap ?? 'tes', - ]; - if($file){ - $imageName = $file->getClientOriginalName(); - $path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}/{$nama_klasifikasi}"; - $file->storeAs($path, $imageName, 'file_directory'); - $payload['file'] =$path .'/' .$imageName; + $files = request()->file("data.fileUpload$index"); + if(!empty($files)){ + foreach ($files['file'] as $file) { + list($id_unit_kerja, $nama_unit_kerja) = explode('/', $value['id_unit_kerja'],2); + list($id_sub_unit_kerja, $nama_sub_unit_kerja) = explode('/', $value['id_sub_unit_kerja'],2); + list($master_kategori_directory_id, $nama_kategori) = explode('/', $value['master_kategori_directory_id'],2); + list($klasifikasi, $nama_klasifikasi) = explode('/', $value['klasifikasi'],2); + $payload = [ + 'master_klasifikasi_directory_id' => $klasifikasi, + 'id_unit_kerja' => $id_unit_kerja, + 'id_sub_unit_kerja' => $id_sub_unit_kerja, + 'master_kategori_directory_id' => $master_kategori_directory_id, + 'pegawai_id_entry' => auth()->user()->dataUser->id ?? 1, + 'pegawai_nama_entry' => auth()->user()->dataUser->namalengkap ?? 'tes', + ]; + if($file){ + $imageName = $file->getClientOriginalName(); + $path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}/{$nama_klasifikasi}"; + $file->storeAs($path, $imageName, 'file_directory'); + $payload['file'] =$path .'/' .$imageName; + } + FileDirectory::create($payload); + } } - FileDirectory::create($payload); } DB::connection('dbDirectory')->commit(); return response()->json([ diff --git a/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (5).jpg b/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (5).jpg deleted file mode 100644 index 03dee42..0000000 Binary files a/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (5).jpg and /dev/null differ diff --git a/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (7).jpg b/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (7).jpg deleted file mode 100644 index 03dee42..0000000 Binary files a/public/file/Instalasi Sistem Informasi Manajemen Rumah Sakit/Instalasi Sistem Informasi Manajemen Rumah Sakit/Juknis/Medis/PAKET 1 (NASI PUTIH, AYAM TALIWANG, TUMIS KANGKUNG, SAMBAL) (7).jpg and /dev/null differ diff --git a/public/js/dashboard/action.js b/public/js/dashboard/action.js index 57b80a1..17a791b 100644 --- a/public/js/dashboard/action.js +++ b/public/js/dashboard/action.js @@ -1,57 +1,133 @@ + let allFiles = []; + document.addEventListener("DOMContentLoaded", () => { + document.querySelectorAll(".file-input").forEach(input => { + bindFileUpload(input); + }); + }); -formCreate.on('submit', function(e){ - e.preventDefault(); + function bindFileUpload(input) { + const dropArea = input.closest(".file-drop-area"); + const fileNameBox = dropArea.querySelector(".file-name"); + const inputId = input?.id; + allFiles[inputId] = []; + input.addEventListener("change", function () { + for (let i = 0; i < this.files.length; i++) { + allFiles[inputId].push(this.files[i]); + } + renderFileList(inputId, fileNameBox); + this.value = ""; // reset agar bisa pilih file lagi + }); + } - const form = this; - const formData = new FormData(form); - - fetch(`/upload`, { - method: 'POST', - headers: { - 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, - }, - body: formData - }).then(async(res) => { - const responseData = await res.json(); - if (responseData.status) { - const handler = function () { - Toastify({ - text: responseData.message || 'Berhasil melakukan aksi!', - duration: 3000, - gravity: "top", // bisa "bottom" - position: "right", // bisa "left" - style: { - background: "linear-gradient(to right, #00b09b, #96c93d)", // hijau gradasi - color: "#fff", - } - }).showToast(); - $("#col_add_file").html(''); - colCount = 1; // reset counter - formCreate.find('input[type="text"], input[type="file"]').val(''); - formCreate.find('select').val(null).trigger('change'); - - if($("#klasifikasi_dok").val().length === 0 || $("#kategori_dok").val().length === 0 ){ - index() - }else{ - searchData() - } - modalCreate.removeEventListener('hidden.bs.modal', handler); - }; - modalCreate.addEventListener('hidden.bs.modal', handler); - bootstrap.Modal.getInstance(modalCreate).hide(); - } else { - throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.'); + function renderFileList(inputId, container) { + const files = allFiles[inputId]; + if (!files || files.length === 0) { + container.classList.add("d-none"); + container.innerHTML = ""; + return; } - }).catch(err => { - if (err.message) { + let list = ""; + + container.innerHTML = list; + container.classList.remove("d-none"); + } + + function removeFile(inputId, index) { + allFiles[inputId].splice(index, 1); + const container = document.querySelector(`#${inputId}`).closest(".file-drop-area").querySelector(".file-name"); + renderFileList(inputId, container); + } + + formCreate.on('submit', function(e){ + e.preventDefault(); + + let hasFile = false; + for (const inputId in allFiles) { + if(allFiles[inputId] && allFiles[inputId].length > 0){ + hasFile = true; + break; + } + } + + if(!hasFile){ Swal.fire({ - icon: 'error', - title: 'Gagal', - text: err.message + icon: 'warning', + title: 'Perhatian', + text: 'Silahkan upload minimal 1 file sebelum submit' + }); + return; + } + const formData = new FormData(this); + for (const inputId in allFiles) { + allFiles[inputId].forEach((file, index) => { + formData.append(`data[${inputId}][file][]`, file); // gunakan inputId = name input file di HTML, misal "files[]" }); } + fetch(`/upload`, { + method: 'POST', + headers: { + 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, + }, + body: formData + }).then(async(res) => { + const responseData = await res.json(); + if (responseData.status) { + const handler = function () { + Toastify({ + text: responseData.message || 'Berhasil melakukan aksi!', + duration: 3000, + gravity: "top", // bisa "bottom" + position: "right", // bisa "left" + style: { + background: "linear-gradient(to right, #00b09b, #96c93d)", // hijau gradasi + color: "#fff", + } + }).showToast(); + $("#col_add_file").html(''); + colCount = 1; // reset counter + formCreate.find('input[type="file"]').each(function () { + const newInput = $(this).clone(); // clone dengan attribute multiple + $(this).replaceWith(newInput); // ganti input lama dengan baru + bindFileUpload(newInput[0]) + }); + + formCreate.find('select').val(null).trigger('change'); + document.querySelectorAll(".file-name").forEach(el => { + el.classList.add("d-none"); + el.innerHTML = ""; + }); + if($("#klasifikasi_dok").val().length === 0 || $("#kategori_dok").val().length === 0 ){ + index() + }else{ + searchData() + } + modalCreate.removeEventListener('hidden.bs.modal', handler); + }; + modalCreate.addEventListener('hidden.bs.modal', handler); + bootstrap.Modal.getInstance(modalCreate).hide(); + } else { + throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.'); + } + + }).catch(err => { + if (err.message) { + Swal.fire({ + icon: 'error', + title: 'Gagal', + text: err.message + }); + } + }); }); -}); diff --git a/public/js/dashboard/functions.js b/public/js/dashboard/functions.js index b29d498..c4becb9 100644 --- a/public/js/dashboard/functions.js +++ b/public/js/dashboard/functions.js @@ -90,8 +90,9 @@ function addForm(){ let html = ''; - html += `
-
+ html += ` +
+
-
+
-
- - -
-
+
-
+
+
+ +
+ +
+
+
Format yang didukung: PDF, JPG, PNG, Excel dan Word
+
+
` - col.append(html) - if(allAkses){ - selectOptionUnitKerjaV1(colCount) - }else{ - selectOptionUnitKerjaV2(colCount) - } - colCount++; + col.append(html) + let newInput = document.querySelector(`#fileUpload${colCount}`); + bindFileUpload(newInput); + if(allAkses){ + selectOptionUnitKerjaV1(colCount) + }else{ + selectOptionUnitKerjaV2(colCount) + } + colCount++; } diff --git a/public/js/dashboard/index.js b/public/js/dashboard/index.js index 7228010..d0d2eb4 100644 --- a/public/js/dashboard/index.js +++ b/public/js/dashboard/index.js @@ -1,10 +1,11 @@ -function renderTree(units, katDok) { +function renderTree(units, katDok, keyword) { if (!Array.isArray(units)) return ''; return ` ` : ''} - - `).join('')} + ` + }).join('')} `; } @@ -101,7 +102,7 @@ function index(kategori_dok = [], unitKerja = null, subUnitKerja = [], klasifika file_tree.innerHTML = ''; if (Array.isArray(data?.data?.unitKerja)) { - file_tree.innerHTML = renderTree(data.data.unitKerja, data.data.katDok); + file_tree.innerHTML = renderTree(data.data.unitKerja, data.data.katDok, keyword); // Toggle buka/tutup folder file_tree.querySelectorAll(".folder > span").forEach(span => { @@ -155,13 +156,21 @@ function searchData(){ index(kategori_dok, unitKerja, subUnitKerja, klasifikasi_id); } -function searchFile(keyword){ +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.value); + index(kategori_dok, unitKerja, subUnitKerja, klasifikasi_id, keyword); } diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php index bb0dba3..e8b9cba 100644 --- a/resources/views/dashboard/index.blade.php +++ b/resources/views/dashboard/index.blade.php @@ -52,6 +52,7 @@ color: blue; cursor: pointer; } + @section('body_main')
@@ -120,48 +121,10 @@ - +
-
-
- - -
-
- 📄 Preview -
- -
- - -
-
- -
-
-

📂 Pilih file untuk melihat preview

-
-
- - - - -
-
@@ -171,6 +134,7 @@ @include('dashboard.modal.create') +@include('dashboard.modal.view') + diff --git a/resources/views/dashboard/modal/create.blade.php b/resources/views/dashboard/modal/create.blade.php index 18043a1..5fdfda7 100644 --- a/resources/views/dashboard/modal/create.blade.php +++ b/resources/views/dashboard/modal/create.blade.php @@ -26,7 +26,7 @@ -
+
-
- - - {{-- - --}} -
-
+
- +
+ +
+ +
+
+
+ Form bersifat multiple dan format yang didukung: JPG, JPEG, PDF, PNG, PPT Excel dan Word +
+
+
+ + + + + + + + + +