diff --git a/app/Http/Controllers/Data/UmkmController.php b/app/Http/Controllers/Data/UmkmController.php index 6490c86..01bdef8 100644 --- a/app/Http/Controllers/Data/UmkmController.php +++ b/app/Http/Controllers/Data/UmkmController.php @@ -60,7 +60,7 @@ class UmkmController extends Controller $modelInstance = Umkm::find($id); // Pastikan model ditemukan if (!$modelInstance) { - return redirect()->route('umkm.index')->with('error', 'Umkm not found'); + return redirect()->route('web-umkm.index')->with('error', 'Umkm not found'); } // Mengambil dan memetakan village_name dan district_name diff --git a/database/seeders/UsersRoleMenuSeeder.php b/database/seeders/UsersRoleMenuSeeder.php index 02cb854..3239d52 100644 --- a/database/seeders/UsersRoleMenuSeeder.php +++ b/database/seeders/UsersRoleMenuSeeder.php @@ -181,7 +181,7 @@ class UsersRoleMenuSeeder extends Seeder ], [ "name" => "UMKM", - "url" => "umkm.index", + "url" => "web-umkm.index", "icon" => null, "parent_id" => $data->id, "sort_order" => 4, diff --git a/deploy.sh b/deploy.sh index 0c7b0f0..9a9f7d6 100755 --- a/deploy.sh +++ b/deploy.sh @@ -14,7 +14,7 @@ npm ci --no-audit --no-fund npm run build echo "📦 Installing composer dependencies..." -composer install --no-interaction --optimize-autoloader +COMPOSER_ALLOW_SUPERUSER=1 composer install --no-interaction --optimize-autoloader echo "🗄️ Running migrations..." php artisan migrate --force diff --git a/resources/js/data/umkm/form-create-update.js b/resources/js/data/umkm/form-create-update.js index d0ebd52..22dfe03 100644 --- a/resources/js/data/umkm/form-create-update.js +++ b/resources/js/data/umkm/form-create-update.js @@ -16,10 +16,10 @@ document.addEventListener("DOMContentLoaded", function () { Loading... `; const isEdit = saveButton.classList.contains("btn-edit"); - const formData = new FormData(form) - const toast = document.getElementById('toastEditUpdate'); - const toastBody = toast.querySelector('.toast-body'); - const toastHeader = toast.querySelector('.toast-header small'); + const formData = new FormData(form); + const toast = document.getElementById("toastEditUpdate"); + const toastBody = toast.querySelector(".toast-body"); + const toastHeader = toast.querySelector(".toast-header small"); const data = {}; @@ -40,53 +40,88 @@ document.addEventListener("DOMContentLoaded", function () { .querySelector('meta[name="api-token"]') .getAttribute("content")}`, "Content-Type": "application/json", - } + }, }) - .then(response => response.json()) - .then(data => { - console.log("Response data:", data); - if (!data.errors) { - // Remove existing icon (if any) before adding the new one - if (authLogo) { - // Hapus ikon yang sudah ada jika ada - const existingIcon = authLogo.querySelector('.bx'); - if (existingIcon) { - authLogo.removeChild(existingIcon); + .then((response) => response.json()) + .then((data) => { + console.log("Response data:", data); + if (!data.errors) { + // Remove existing icon (if any) before adding the new one + if (authLogo) { + // Hapus ikon yang sudah ada jika ada + const existingIcon = authLogo.querySelector(".bx"); + if (existingIcon) { + authLogo.removeChild(existingIcon); + } + + // Buat ikon baru + const icon = document.createElement("i"); + icon.classList.add("bx", "bxs-check-square"); + icon.style.fontSize = "25px"; + icon.style.color = "green"; // Pastikan 'green' dalam bentuk string + + // Tambahkan ikon ke dalam auth-logo + authLogo.appendChild(icon); } - // Buat ikon baru - const icon = document.createElement('i'); - icon.classList.add('bx', 'bxs-check-square'); - icon.style.fontSize = '25px'; - icon.style.color = 'green'; // Pastikan 'green' dalam bentuk string + // Set success message for the toast + toastBody.textContent = isEdit + ? "Data updated successfully!" + : "Data created successfully!"; + toast.classList.add("show"); // Show the toast + setTimeout(() => { + toast.classList.remove("show"); // Hide the toast after 3 seconds + }, 2000); - // Tambahkan ikon ke dalam auth-logo - authLogo.appendChild(icon); + setTimeout(() => { + window.location.href = "/data/web-umkm"; + }, 1000); + } else { + if (authLogo) { + // Hapus ikon yang sudah ada jika ada + const existingIcon = authLogo.querySelector(".bx"); + if (existingIcon) { + authLogo.removeChild(existingIcon); + } + + // Buat ikon baru + const icon = document.createElement("i"); + icon.classList.add("bx", "bxs-error-alt"); + icon.style.fontSize = "25px"; + icon.style.color = "red"; // Pastikan 'green' dalam bentuk string + + // Tambahkan ikon ke dalam auth-logo + authLogo.appendChild(icon); + } + + // Enable button and reset its text on error + modalButton.disabled = false; + modalButton.innerHTML = isEdit ? "Update" : "Create"; + + // Set error message for the toast + toastBody.textContent = + "Error: " + (data.message || "Something went wrong"); + toast.classList.add("show"); // Show the toast + + setTimeout(() => { + toast.classList.remove("show"); // Hide the toast after 3 seconds + }, 3000); } - - // Set success message for the toast - toastBody.textContent = isEdit ? "Data updated successfully!" : "Data created successfully!"; - toast.classList.add('show'); // Show the toast - setTimeout(() => { - toast.classList.remove('show'); // Hide the toast after 3 seconds - }, 2000); - - setTimeout(() => { - window.location.href = '/data/umkm'; - }, 1000); - } else { + }) + .catch((error) => { + console.error("Error:", error); if (authLogo) { // Hapus ikon yang sudah ada jika ada - const existingIcon = authLogo.querySelector('.bx'); + const existingIcon = authLogo.querySelector(".bx"); if (existingIcon) { authLogo.removeChild(existingIcon); } // Buat ikon baru - const icon = document.createElement('i'); - icon.classList.add('bx', 'bxs-error-alt'); - icon.style.fontSize = '25px'; - icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string + const icon = document.createElement("i"); + icon.classList.add("bx", "bxs-error-alt"); + icon.style.fontSize = "25px"; + icon.style.color = "red"; // Pastikan 'green' dalam bentuk string // Tambahkan ikon ke dalam auth-logo authLogo.appendChild(icon); @@ -96,47 +131,15 @@ document.addEventListener("DOMContentLoaded", function () { modalButton.disabled = false; modalButton.innerHTML = isEdit ? "Update" : "Create"; - // Set error message for the toast - toastBody.textContent = "Error: " + (data.message || "Something went wrong"); - toast.classList.add('show'); // Show the toast + toastBody.textContent = + "An error occurred while processing your request."; + toast.classList.add("show"); // Show the toast setTimeout(() => { - toast.classList.remove('show'); // Hide the toast after 3 seconds + toast.classList.remove("show"); // Hide the toast after 3 seconds }, 3000); - } - }) - .catch(error => { - console.error("Error:", error); - if (authLogo) { - // Hapus ikon yang sudah ada jika ada - const existingIcon = authLogo.querySelector('.bx'); - if (existingIcon) { - authLogo.removeChild(existingIcon); - } - - // Buat ikon baru - const icon = document.createElement('i'); - icon.classList.add('bx', 'bxs-error-alt'); - icon.style.fontSize = '25px'; - icon.style.color = 'red'; // Pastikan 'green' dalam bentuk string - - // Tambahkan ikon ke dalam auth-logo - authLogo.appendChild(icon); - } - - // Enable button and reset its text on error - modalButton.disabled = false; - modalButton.innerHTML = isEdit ? "Update" : "Create"; - - // Set error message for the toast - toastBody.textContent = "An error occurred while processing your request."; - toast.classList.add('show'); // Show the toast - - setTimeout(() => { - toast.classList.remove('show'); // Hide the toast after 3 seconds - }, 3000); - }); + }); }); // Fungsi fetchOptions untuk autocomplete server-side @@ -145,7 +148,11 @@ document.addEventListener("DOMContentLoaded", function () { if (inputValue.length < 2) return; let districtValue = document.getElementById("district_name").value; // Ambil kecamatan terpilih - let url = `${GlobalConfig.apiHost}/api/combobox/search-options?query=${encodeURIComponent(inputValue)}&field=${field}`; + let url = `${ + GlobalConfig.apiHost + }/api/combobox/search-options?query=${encodeURIComponent( + inputValue + )}&field=${field}`; // Jika field desa, tambahkan kecamatan sebagai filter if (field === "village_name") { @@ -153,30 +160,30 @@ document.addEventListener("DOMContentLoaded", function () { } fetch(url, { - method: 'GET', + method: "GET", headers: { Authorization: `Bearer ${document .querySelector('meta[name="api-token"]') .getAttribute("content")}`, "Content-Type": "application/json", - } + }, }) - .then(response => response.json()) - .then(data => { - let dataList = document.getElementById(field + "Options"); - dataList.innerHTML = ""; + .then((response) => response.json()) + .then((data) => { + let dataList = document.getElementById(field + "Options"); + dataList.innerHTML = ""; - data.forEach(item => { - let option = document.createElement("option"); - option.value = item.name; - option.dataset.code = item.code; - dataList.appendChild(option); - }); - }) - .catch(error => console.error("Error fetching options:", error)); + data.forEach((item) => { + let option = document.createElement("option"); + option.value = item.name; + option.dataset.code = item.code; + dataList.appendChild(option); + }); + }) + .catch((error) => console.error("Error fetching options:", error)); }; - document.querySelector('.btn-back').addEventListener('click', function() { + document.querySelector(".btn-back").addEventListener("click", function () { window.history.back(); }); -}); \ No newline at end of file +}); diff --git a/resources/js/data/umkm/form-upload.js b/resources/js/data/umkm/form-upload.js index e1828e9..6290325 100644 --- a/resources/js/data/umkm/form-upload.js +++ b/resources/js/data/umkm/form-upload.js @@ -18,58 +18,61 @@ console.log(dropzonePreviewNode); url: `${GlobalConfig.apiHost}/api/umkm/import`, // url: "https://httpbin.org/post", method: "post", - acceptedFiles: ".xls,.xlsx", // Use acceptedFiles for better validation + acceptedFiles: ".xls,.xlsx", // Use acceptedFiles for better validation previewTemplate: previewTemplate, previewsContainer: "#dropzone-preview", - autoProcessQueue: false, // Disable auto post + autoProcessQueue: false, // Disable auto post headers: { Authorization: `Bearer ${document .querySelector('meta[name="api-token"]') - .getAttribute("content")}` + .getAttribute("content")}`, }, - init: function() { + init: function () { // Listen for the success event - this.on("success", function(file, response) { + this.on("success", function (file, response) { console.log("File successfully uploaded:", file); console.log("API Response:", response); - + // Show success toast - showToast('bxs-check-square', 'green', response.message); - document.getElementById("submit-upload").innerHTML = "Upload Files"; + showToast("bxs-check-square", "green", response.message); + document.getElementById("submit-upload").innerHTML = + "Upload Files"; // Tunggu sebentar lalu reload halaman setTimeout(() => { - window.location.href = "/data/umkm"; + window.location.href = "/data/web-umkm"; }, 2000); }); // Listen for the error event - this.on("error", function(file, errorMessage) { + this.on("error", function (file, errorMessage) { console.error("Error uploading file:", file); console.error("Error message:", errorMessage); // Handle the error response // Show error toast - showToast('bxs-error-alt', 'red', errorMessage.message); - document.getElementById("submit-upload").innerHTML = "Upload Files"; + showToast("bxs-error-alt", "red", errorMessage.message); + document.getElementById("submit-upload").innerHTML = + "Upload Files"; }); - } + }, }))); // Add event listener to control the submission manually -document.querySelector("#submit-upload").addEventListener("click", function() { +document.querySelector("#submit-upload").addEventListener("click", function () { console.log("Ini adalah value dropzone", dropzone.files[0]); - const formData = new FormData() - console.log("Dropzonefiles",dropzone.files); + const formData = new FormData(); + console.log("Dropzonefiles", dropzone.files); - this.innerHTML = 'Loading...'; + this.innerHTML = + 'Loading...'; // Pastikan ada file dalam queue sebelum memprosesnya if (dropzone.files.length > 0) { - formData.append('file', dropzone.files[0]) + formData.append("file", dropzone.files[0]); console.log("ini adalah form data on submit", ...formData); - dropzone.processQueue(); // Ini akan manual memicu upload + dropzone.processQueue(); // Ini akan manual memicu upload } else { // Show error toast when no file is selected - showToast('bxs-error-alt', 'red', "Please add a file first."); + showToast("bxs-error-alt", "red", "Please add a file first."); document.getElementById("submit-upload").innerHTML = "Upload Files"; } }); @@ -82,62 +85,68 @@ dropzone.on("addedfile", function (file) { console.log("Ukuran File:", (file.size / 1024).toFixed(2) + " KB"); }); -dropzone.on("complete", function(file) { +dropzone.on("complete", function (file) { dropzone.removeFile(file); }); // Add event listener to download file template -document.getElementById('downloadtempumkm').addEventListener('click', function() { - var url = `${GlobalConfig.apiHost}/api/download-template-umkm`; - fetch(url, { - method: 'GET', - headers: { - Authorization: `Bearer ${document - .querySelector('meta[name="api-token"]') - .getAttribute("content")}` - }, - }) - .then(response => { - if (response.ok) { - return response.blob(); // Jika respons OK, konversi menjadi blob - } else { - return response.json(); // Jika respons gagal, konversi menjadi JSON untuk menangani pesan error - } - }) - .then((blob) => { - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.style.display = 'none'; - a.href = url; - a.download = 'template_umkm.xlsx'; - document.body.appendChild(a); - a.click(); - window.URL.revokeObjectURL(url); - }) - .catch((error) => { - console.error("Gagal mendownload file:", error); - showToast('bxs-error-alt', 'red', "Template file is not already exist."); - }) -}) +document + .getElementById("downloadtempumkm") + .addEventListener("click", function () { + var url = `${GlobalConfig.apiHost}/api/download-template-umkm`; + fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${document + .querySelector('meta[name="api-token"]') + .getAttribute("content")}`, + }, + }) + .then((response) => { + if (response.ok) { + return response.blob(); // Jika respons OK, konversi menjadi blob + } else { + return response.json(); // Jika respons gagal, konversi menjadi JSON untuk menangani pesan error + } + }) + .then((blob) => { + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.style.display = "none"; + a.href = url; + a.download = "template_umkm.xlsx"; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + }) + .catch((error) => { + console.error("Gagal mendownload file:", error); + showToast( + "bxs-error-alt", + "red", + "Template file is not already exist." + ); + }); + }); // Function to show toast function showToast(iconClass, iconColor, message) { - const toastElement = document.getElementById('toastUploadUmkm'); - const toastBody = toastElement.querySelector('.toast-body'); - const toastHeader = toastElement.querySelector('.toast-header'); + const toastElement = document.getElementById("toastUploadUmkm"); + const toastBody = toastElement.querySelector(".toast-body"); + const toastHeader = toastElement.querySelector(".toast-header"); // Remove existing icon (if any) before adding the new one - const existingIcon = toastHeader.querySelector('.bx'); + const existingIcon = toastHeader.querySelector(".bx"); if (existingIcon) { - toastHeader.querySelector('.auth-logo').removeChild(existingIcon); // Remove the existing icon + toastHeader.querySelector(".auth-logo").removeChild(existingIcon); // Remove the existing icon } // Add the new icon to the toast header - const icon = document.createElement('i'); - icon.classList.add('bx', iconClass); - icon.style.fontSize = '25px'; + const icon = document.createElement("i"); + icon.classList.add("bx", iconClass); + icon.style.fontSize = "25px"; icon.style.color = iconColor; - toastHeader.querySelector('.auth-logo').appendChild(icon); + toastHeader.querySelector(".auth-logo").appendChild(icon); // Set the toast message toastBody.textContent = message; @@ -146,4 +155,3 @@ function showToast(iconClass, iconColor, message) { const toast = new bootstrap.Toast(toastElement); // Inisialisasi Bootstrap Toast toast.show(); } - diff --git a/routes/web.php b/routes/web.php index befd164..8da0bfc 100755 --- a/routes/web.php +++ b/routes/web.php @@ -84,7 +84,7 @@ Route::group(['middleware' => 'auth'], function(){ Route::get('/advertisements/bulk-create', [AdvertisementController::class, 'bulkCreate'])->name('advertisements.bulk-create'); // Resource route, kecuali create karena dibuat terpisah - Route::resource('/umkm', UmkmController::class)->except(['create', 'show']); + Route::resource('/web-umkm', UmkmController::class)->except(['create', 'show']); // Rute khusus untuk create dan bulk-create Route::get('/umkm/create', [UmkmController::class, 'create'])->name('umkm.create');