From 46d0ef882590987e3c85f9be94ce77b927a10783 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Wed, 17 Jun 2026 20:24:55 +0000 Subject: [PATCH] QR: add type-to-confirm delete on the QR code page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Users asked to delete codes they no longer need. Add a destroy route + controller action (authorized via QrCodePolicy::delete) and a danger-zone delete on the show page behind a confirmation modal that requires typing the code's label — deliberately not a one-click delete since it permanently breaks the printed code and removes its scan history. Co-Authored-By: Claude Opus 4.8 --- app/Http/Controllers/Qr/QrCodeController.php | 14 ++++++ resources/views/qr-codes/show.blade.php | 47 ++++++++++++++++++++ routes/web.php | 1 + 3 files changed, 62 insertions(+) diff --git a/app/Http/Controllers/Qr/QrCodeController.php b/app/Http/Controllers/Qr/QrCodeController.php index 706a3f3..ecdcdac 100644 --- a/app/Http/Controllers/Qr/QrCodeController.php +++ b/app/Http/Controllers/Qr/QrCodeController.php @@ -279,6 +279,20 @@ class QrCodeController extends Controller return back()->with('success', 'QR code updated.'); } + public function destroy(Request $request, QrCode $qrCode): RedirectResponse + { + $this->authorize('delete', $qrCode); + + // Remove the code and its scan history. Deletion is gated behind a + // type-to-confirm dialog in the UI — this is intentionally permanent. + $qrCode->scans()->delete(); + $qrCode->delete(); + + return redirect() + ->route('user.qr-codes.index') + ->with('success', 'QR code deleted.'); + } + public function stylePreview(Request $request): Response { $validated = $request->validate(array_merge($this->styleRules(), [ diff --git a/resources/views/qr-codes/show.blade.php b/resources/views/qr-codes/show.blade.php index 4a0ad03..6ce791d 100644 --- a/resources/views/qr-codes/show.blade.php +++ b/resources/views/qr-codes/show.blade.php @@ -339,5 +339,52 @@ + {{-- Danger zone: delete this QR code (type-to-confirm, not a one-click delete) --}} +
+
+
+

Delete this QR code

+

The printed code stops working permanently and its scan history is removed. This can't be undone.

+
+ +
+ +
+
+
+

Delete “{{ $qrCode->label }}”?

+

+ This permanently deletes the code and its scan history. Anyone who scans the printed code will get an error. + This cannot be undone. +

+ + +
+ +
+ @csrf + @method('DELETE') + +
+
+
+
+
+ diff --git a/routes/web.php b/routes/web.php index 81c1634..24062be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -48,6 +48,7 @@ Route::middleware(['auth'])->group(function () { Route::post('/qr-codes/style-preview', [QrCodeController::class, 'stylePreview'])->name('user.qr-codes.style-preview'); Route::get('/qr-codes/{qrCode}', [QrCodeController::class, 'show'])->name('user.qr-codes.show'); Route::patch('/qr-codes/{qrCode}', [QrCodeController::class, 'update'])->name('user.qr-codes.update'); + Route::delete('/qr-codes/{qrCode}', [QrCodeController::class, 'destroy'])->name('user.qr-codes.destroy'); Route::post('/qr-codes/{qrCode}/canonical-image', [QrCodeController::class, 'storeCanonicalImage'])->name('user.qr-codes.canonical-image'); Route::get('/qr-codes/{qrCode}/preview.png', [QrCodeController::class, 'preview'])->name('user.qr-codes.preview'); Route::get('/qr-codes/{qrCode}/download/{format}', [QrCodeController::class, 'download'])->name('user.qr-codes.download')->whereIn('format', ['png', 'svg', 'pdf']);