perling/public/assets/js/backend/pertek/script_fileUpload.js

153 lines
5.5 KiB
JavaScript

document.addEventListener("DOMContentLoaded", function () {
// Process all file upload elements
const fileInputs = document.querySelectorAll(".file-upload");
const MAX_FILE_SIZE = 20 * 1024 * 1024; // 20MB in bytes
// Function to show alert for a specific upload field
function showAlert(message, type = "danger", targetElement) {
// Create alert element
const alertDiv = document.createElement("div");
alertDiv.className = `alert alert-${type} alert-dismissible fade show mt-2`;
alertDiv.role = "alert";
alertDiv.innerHTML = `
${message}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
`;
// Insert after the target element
targetElement.parentNode.insertBefore(
alertDiv,
targetElement.nextSibling
);
// Auto dismiss after 5 seconds
setTimeout(() => {
alertDiv.classList.remove("show");
setTimeout(() => alertDiv.remove(), 150);
}, 5000);
}
fileInputs.forEach((fileInput) => {
const fileId = fileInput.id;
const uploadBtn = document.querySelector(
`[data-target="${fileId}"].upload-btn`
);
const uploadContainer = fileInput.closest(".input-group");
const previewContainer = document.getElementById(`${fileId}Preview`);
if (!previewContainer) return; // Skip if preview container doesn't exist
// Find the small text element that says "Maks. berukuran 20 MB dan berformat pdf"
const helpTextElement = uploadContainer
.closest(".card-body")
.querySelector("small.text-muted");
const removeBtn = previewContainer.querySelector(".remove-file");
let errorElement = uploadContainer.nextElementSibling;
// If no error element exists, create one
if (
!errorElement ||
!errorElement.classList.contains("wizard-form-error")
) {
errorElement = document.createElement("div");
errorElement.className = "wizard-form-error text-danger mt-1";
uploadContainer.parentNode.insertBefore(
errorElement,
uploadContainer.nextSibling
);
}
// Process file upload and show preview
function processFileUpload() {
const file = fileInput.files[0];
if (!file) return;
// Validate file type (PDF only)
if (file.type !== "application/pdf") {
errorElement.textContent = "Hanya file PDF yang diperbolehkan";
showAlert(
"Format file tidak valid! Hanya file PDF yang diperbolehkan.",
"danger",
helpTextElement
);
fileInput.value = ""; // Clear the input
return;
}
// Validate file size (max 20MB)
if (file.size > MAX_FILE_SIZE) {
errorElement.textContent =
"Ukuran file tidak boleh melebihi 20MB";
showAlert(
"Ukuran file terlalu besar! File tidak boleh melebihi 20MB.",
"danger",
helpTextElement
);
fileInput.value = ""; // Clear the input
return;
}
// Clear any previous error
errorElement.textContent = "";
// Hide upload container when file is uploaded
uploadContainer.classList.add("d-none");
// Show preview
previewContainer.classList.remove("d-none");
// Update preview content
const previewImg = previewContainer.querySelector(".preview-img");
const previewIcon = previewContainer.querySelector(".preview-icon");
const previewFilename =
previewContainer.querySelector(".preview-filename");
const previewFilesize =
previewContainer.querySelector(".preview-filesize");
// Set filename and filesize
previewFilename.textContent = file.name;
previewFilesize.textContent = formatFileSize(file.size);
// Show PDF icon for PDFs
previewImg.classList.add("d-none");
previewIcon.classList.remove("d-none");
}
// Format file size
function formatFileSize(bytes) {
if (bytes < 1024) return bytes + " bytes";
else if (bytes < 1048576) return (bytes / 1024).toFixed(2) + " KB";
else return (bytes / 1048576).toFixed(2) + " MB";
}
// Upload button click handler
if (uploadBtn) {
uploadBtn.addEventListener("click", function () {
processFileUpload();
});
}
// File input change handler
fileInput.addEventListener("change", function () {
if (this.files.length > 0) {
processFileUpload();
}
});
// Remove file handler
if (removeBtn) {
removeBtn.addEventListener("click", function () {
// Reset file input
fileInput.value = "";
// Clear any error message
errorElement.textContent = "";
// Show upload container again
uploadContainer.classList.remove("d-none");
// Hide preview
previewContainer.classList.add("d-none");
});
}
});
});