diff --git a/resources/js/csp-safe.js b/resources/js/csp-safe.js
index 417dee97a..c65590d17 100644
--- a/resources/js/csp-safe.js
+++ b/resources/js/csp-safe.js
@@ -733,8 +733,8 @@ window.showConfirm = function(options) {
detailsDiv.classList.add('hidden');
}
- // Store callback
- confirmationCallback = config.onConfirm;
+ // Store callback for use when confirm is clicked
+ const storedOnConfirm = config.onConfirm;
// Show modal
modal.classList.remove('hidden');
@@ -743,8 +743,8 @@ window.showConfirm = function(options) {
// Return promise for async/await usage
return new Promise((resolve, reject) => {
confirmationCallback = function(confirmed) {
- if (confirmed && config.onConfirm) {
- config.onConfirm();
+ if (confirmed && storedOnConfirm) {
+ storedOnConfirm();
}
resolve(confirmed);
};
@@ -1172,7 +1172,87 @@ function initRegexManagement() {
}
e.preventDefault();
}
+
+ // Handle release delete buttons
+ if (e.target.hasAttribute('data-delete-release') || e.target.closest('[data-delete-release]')) {
+ const element = e.target.hasAttribute('data-delete-release') ? e.target : e.target.closest('[data-delete-release]');
+ const id = element.getAttribute('data-delete-release');
+ const deleteUrl = element.getAttribute('data-delete-url');
+
+ showConfirm({
+ title: 'Delete Release',
+ message: 'Are you sure you want to delete this release? This action cannot be undone.',
+ type: 'danger',
+ confirmText: 'Delete',
+ onConfirm: function() {
+ deleteRelease(id, deleteUrl, element);
+ }
+ });
+ e.preventDefault();
+ }
});
+
+ // Delete release function
+ window.deleteRelease = function(id, deleteUrl, element) {
+ const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content;
+
+ if (!csrfToken) {
+ console.error('CSRF token not found');
+ if (typeof showToast === 'function') {
+ showToast('Security token not found. Please refresh the page.', 'error');
+ }
+ return;
+ }
+
+ console.log('Deleting release:', id, 'URL:', deleteUrl);
+
+ if (typeof showToast === 'function') {
+ showToast('Deleting release...', 'info');
+ }
+
+ fetch(deleteUrl, {
+ method: 'POST',
+ headers: {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'X-CSRF-TOKEN': csrfToken,
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json'
+ }
+ })
+ .then(response => {
+ console.log('Delete response status:', response.status);
+ if (response.ok) {
+ const row = element.closest('tr');
+ if (row) {
+ row.style.transition = 'opacity 0.3s';
+ row.style.opacity = '0';
+ setTimeout(() => row.remove(), 300);
+ }
+ if (typeof showToast === 'function') {
+ showToast('Release deleted successfully', 'success');
+ } else {
+ showMessage('Release deleted successfully', 'success');
+ }
+ } else {
+ return response.text().then(text => {
+ console.error('Delete failed with status:', response.status, 'Response:', text);
+ if (typeof showToast === 'function') {
+ showToast('Error deleting release: ' + response.status, 'error');
+ } else {
+ showMessage('Error deleting release', 'error');
+ }
+ });
+ }
+ })
+ .catch(error => {
+ console.error('Error deleting release:', error);
+ if (typeof showToast === 'function') {
+ showToast('Error deleting release: ' + error.message, 'error');
+ } else {
+ showMessage('Error deleting release', 'error');
+ }
+ });
+ };
}
// Mediainfo and Filelist Modals
diff --git a/resources/views/admin/releases/failed.blade.php b/resources/views/admin/releases/failed.blade.php
index 22adeacf8..73cd5c5d1 100644
--- a/resources/views/admin/releases/failed.blade.php
+++ b/resources/views/admin/releases/failed.blade.php
@@ -143,12 +143,13 @@
@endif
-
+
+
diff --git a/resources/views/admin/releases/index.blade.php b/resources/views/admin/releases/index.blade.php
index e9fac5e57..9304973f1 100644
--- a/resources/views/admin/releases/index.blade.php
+++ b/resources/views/admin/releases/index.blade.php
@@ -91,12 +91,13 @@
title="Edit">
-
+
+