// Sky Art Shop - Admin Panel Functions // Delete confirmation with fetch function deleteWithConfirmation(url, itemName, redirectUrl) { if (!confirm(`Are you sure you want to delete ${itemName}?`)) { return false; } fetch(url, { method: "POST", headers: { "Content-Type": "application/json", }, }) .then((response) => { if (response.ok) { window.location.href = redirectUrl || window.location.href; } else { alert("Delete failed. Please try again."); } }) .catch((error) => { alert("Error: " + error.message); }); return false; } // Image upload with preview function uploadImageWithPreview(fileInputId, previewId, urlInputId) { const input = document.getElementById(fileInputId); const file = input.files[0]; if (!file) { alert("Please select a file"); return; } const formData = new FormData(); formData.append("file", file); fetch("/admin/upload/image", { method: "POST", body: formData, }) .then((response) => response.json()) .then((result) => { if (result.success) { document.getElementById(urlInputId).value = result.url; const preview = document.getElementById(previewId); if (preview) { preview.src = result.url; preview.style.display = "block"; } showAdminNotification("Image uploaded successfully!", "success"); } else { showAdminNotification("Upload failed: " + result.message, "error"); } }) .catch((error) => { showAdminNotification("Upload error: " + error.message, "error"); }); } // Show admin notification function showAdminNotification(message, type = "success") { const notification = document.createElement("div"); notification.className = `alert alert-${ type === "success" ? "success" : "danger" } alert-dismissible fade show`; notification.style.cssText = "position: fixed; top: 20px; right: 20px; z-index: 9999; min-width: 300px;"; notification.innerHTML = ` ${message} `; document.body.appendChild(notification); setTimeout(() => { notification.classList.remove("show"); setTimeout(() => notification.remove(), 150); }, 3000); } // Copy to clipboard function copyToClipboard(text) { navigator.clipboard .writeText(text) .then(() => { showAdminNotification("Copied to clipboard!", "success"); }) .catch(() => { showAdminNotification("Failed to copy", "error"); }); } // Auto-generate slug from title function generateSlugFromTitle(titleInputId, slugInputId) { const titleInput = document.getElementById(titleInputId); const slugInput = document.getElementById(slugInputId); if (titleInput && slugInput) { titleInput.addEventListener("input", function () { if (slugInput.value === "" || slugInput.dataset.auto === "true") { slugInput.value = titleInput.value .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/(^-|-$)/g, ""); slugInput.dataset.auto = "true"; } }); slugInput.addEventListener("input", function () { slugInput.dataset.auto = "false"; }); } } // Form validation helper function validateForm(formId) { const form = document.getElementById(formId); if (!form) return true; const requiredFields = form.querySelectorAll("[required]"); let isValid = true; requiredFields.forEach((field) => { if (!field.value.trim()) { field.classList.add("is-invalid"); isValid = false; } else { field.classList.remove("is-invalid"); } }); if (!isValid) { showAdminNotification("Please fill in all required fields", "error"); } return isValid; } // Initialize tooltips document.addEventListener("DOMContentLoaded", function () { // Bootstrap tooltips var tooltipTriggerList = [].slice.call( document.querySelectorAll('[data-bs-toggle="tooltip"]') ); if (typeof bootstrap !== "undefined") { tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); } });