chore: clean publish artifacts and add sources
This commit is contained in:
155
wwwroot/assets/js/admin.js
Executable file
155
wwwroot/assets/js/admin.js
Executable file
@@ -0,0 +1,155 @@
|
||||
// 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}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
`;
|
||||
|
||||
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);
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user