From 394c681c2757590f3217b045c6a63f414b31a9c8 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Wed, 24 Jun 2026 18:22:54 +0200 Subject: [PATCH] Fix release deletion from admin releases list --- .../js/alpine/components/admin/features.js | 34 -------- .../alpine/components/admin/release-list.js | 78 ++++++++++++++++++- .../views/admin/releases/failed.blade.php | 3 +- .../views/admin/releases/index.blade.php | 1 + 4 files changed, 80 insertions(+), 36 deletions(-) diff --git a/resources/js/alpine/components/admin/features.js b/resources/js/alpine/components/admin/features.js index 6f539dd35..9f32e4c37 100644 --- a/resources/js/alpine/components/admin/features.js +++ b/resources/js/alpine/components/admin/features.js @@ -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) { diff --git a/resources/js/alpine/components/admin/release-list.js b/resources/js/alpine/components/admin/release-list.js index a0e9939b5..c739c704f 100644 --- a/resources/js/alpine/components/admin/release-list.js +++ b/resources/js/alpine/components/admin/release-list.js @@ -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)?', diff --git a/resources/views/admin/releases/failed.blade.php b/resources/views/admin/releases/failed.blade.php index 793a1bed1..a7580bb5d 100644 --- a/resources/views/admin/releases/failed.blade.php +++ b/resources/views/admin/releases/failed.blade.php @@ -1,7 +1,7 @@ @extends('layouts.admin') @section('content') -
+
@@ -145,6 +145,7 @@ @endif