Fix release deletion from admin releases list

This commit is contained in:
DariusIII
2026-06-24 18:22:54 +02:00
parent cfa46e477b
commit 394c681c27
4 changed files with 80 additions and 36 deletions
@@ -553,23 +553,6 @@ Alpine.data('regexDelete', () => ({
}
}));
// Release delete
Alpine.data('releaseDelete', () => ({
deleteRelease(e, id, deleteUrl) {
e.preventDefault();
const el = e.currentTarget;
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() {
const csrf = document.querySelector('meta[name="csrf-token"]')?.content;
showToast('Deleting release...', 'info');
fetch(deleteUrl, { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest', 'X-CSRF-TOKEN': csrf, 'Content-Type': 'application/json', 'Accept': 'application/json' } })
.then(r => {
if (r.ok) { const row = el.closest('tr'); if (row) { row.style.transition = 'opacity 0.3s'; row.style.opacity = '0'; setTimeout(() => row.remove(), 300); } showToast('Release deleted successfully', 'success'); }
else showToast('Error deleting release: ' + r.status, 'error');
}).catch(err => showToast('Error deleting release: ' + err.message, 'error'));
}});
}
}));
// My Movies confirm
Alpine.data('myMovies', () => ({
confirmRemove(e) {
@@ -741,23 +724,6 @@ Alpine.data('myMovies', () => ({
return;
}
// Release delete
var relDel = e.target.closest('[data-delete-release]');
if (relDel) {
e.preventDefault();
var deleteUrl = relDel.getAttribute('data-delete-url');
showConfirm({ title: 'Delete Release', message: 'Are you sure? This cannot be undone.', type: 'danger', confirmText: 'Delete',
onConfirm: function() {
var csrf = document.querySelector('meta[name="csrf-token"]')?.content;
showToast('Deleting...', 'info');
fetch(deleteUrl, { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest', 'X-CSRF-TOKEN': csrf, 'Content-Type': 'application/json', 'Accept': 'application/json' } })
.then(function(r) { if (r.ok) { var row = relDel.closest('tr'); if (row) { row.style.transition='opacity 0.3s'; row.style.opacity='0'; setTimeout(function() { row.remove(); },300); } showToast('Deleted', 'success'); } else showToast('Error: ' + r.status, 'error'); })
.catch(function(err) { showToast('Error: ' + err.message, 'error'); });
}
});
return;
}
// Binary blacklist delete
var blDel = e.target.closest('[data-delete-blacklist]');
if (blDel) {
@@ -63,6 +63,83 @@ Alpine.data('adminReleaseList', () => ({
}
},
showToast(message, type) {
Alpine.store('toast').show(message, type);
},
deleteRelease(e) {
e.preventDefault();
const button = e.currentTarget;
const deleteUrl = button.dataset.deleteUrl;
if (!deleteUrl) {
this.showToast('Release delete URL is missing.', 'error');
return;
}
this.showModal({
title: 'Delete Release',
message: 'Are you sure you want to delete this release?',
details: 'This action cannot be undone.',
type: 'danger',
confirmText: 'Delete',
cancelText: 'Cancel',
onConfirm: () => this.submitReleaseDelete(button, deleteUrl),
});
},
submitReleaseDelete(button, deleteUrl) {
const csrf = document.querySelector('meta[name="csrf-token"]')?.content;
if (!csrf) {
this.showToast('Unable to delete release: CSRF token is missing.', 'error');
return;
}
button.disabled = true;
button.setAttribute('aria-busy', 'true');
this.showToast('Deleting release...', 'info');
fetch(deleteUrl, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': csrf,
'Accept': 'application/json',
},
})
.then(response => response.json().catch(() => ({})).then(data => ({ response, data })))
.then(({ response, data }) => {
if (!response.ok || data.success === false) {
throw new Error(data.message || 'Error deleting release: ' + response.status);
}
const row = button.closest('tr');
if (row) {
row.style.transition = 'opacity 0.3s';
row.style.opacity = '0';
setTimeout(() => {
row.remove();
this.syncSelectionState();
}, 300);
} else {
this.syncSelectionState();
}
this.showToast(data.message || 'Release deleted successfully', 'success');
})
.catch(error => {
button.disabled = false;
this.showToast(error.message || 'Error deleting release.', 'error');
})
.finally(() => {
button.removeAttribute('aria-busy');
});
},
validateBulkAction(e) {
e.preventDefault();
@@ -99,7 +176,6 @@ Alpine.data('adminReleaseList', () => ({
return;
}
const self = this;
this.showModal({
title: 'Change category',
message: 'Change category for ' + checkedCount + ' release(s)?',
@@ -1,7 +1,7 @@
@extends('layouts.admin')
@section('content')
<div class="space-y-6">
<div x-data="adminReleaseList" class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
@@ -145,6 +145,7 @@
@endif
<button type="button"
class="text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300"
@click="deleteRelease($event)"
data-delete-release="{{ $release->guid }}"
data-delete-url="{{ url('/admin/release-delete/' . $release->guid) }}"
title="Delete release">
@@ -158,6 +158,7 @@
</a>
<button type="button"
class="text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300"
@click="deleteRelease($event)"
data-delete-release="{{ $release->guid }}"
data-delete-url="{{ url('admin/release-delete/' . $release->guid) }}"
title="Delete">