From af0c72ebcc9f7a5411efcab07845b0c7e8455df9 Mon Sep 17 00:00:00 2001 From: Thorsten Bus Date: Mon, 2 Mar 2026 23:02:51 +0100 Subject: [PATCH] feat(ui): improve arrangement configurator, song preview, and downloads Simplify ArrangementConfigurator: replace color pickers with compact pills, add click-to-add from pool, use watcher-based auto-select for new/cloned arrangements, remove group_colors from save payload. Enhance SongsBlock preview: color-coded group headers with tinted backgrounds, PDF download button inside preview modal, .pro download link per matched song, show DB ccli_id with fallback to CTS ccli_id. Fix Modal z-index for nested dialogs. Fix SlideUploader duplicate upload on watch by adding deep option and upload guard. Expand API log detail sections by default and increase JSON tree depth. Convert song download button from emit to direct .pro download link. --- app/Http/Controllers/SongPdfController.php | 24 ++- .../js/Components/ArrangementConfigurator.vue | 202 +++++++----------- resources/js/Components/Blocks/SongsBlock.vue | 56 ++++- resources/js/Components/Modal.vue | 2 +- resources/js/Components/SlideUploader.vue | 5 +- resources/js/Pages/ApiLogs/Index.vue | 7 +- resources/js/Pages/Songs/Index.vue | 7 +- 7 files changed, 143 insertions(+), 160 deletions(-) diff --git a/app/Http/Controllers/SongPdfController.php b/app/Http/Controllers/SongPdfController.php index 0857d72..7614bef 100644 --- a/app/Http/Controllers/SongPdfController.php +++ b/app/Http/Controllers/SongPdfController.php @@ -31,21 +31,27 @@ public function preview(Song $song, SongArrangement $arrangement): JsonResponse ]); } - public function download(Song $song, SongArrangement $arrangement): Response + public function download(Song $song, SongArrangement $arrangement): Response|JsonResponse { abort_unless($arrangement->song_id === $song->id, 404); - $groupsInOrder = $this->buildGroupsInOrder($arrangement); + try { + $groupsInOrder = $this->buildGroupsInOrder($arrangement); - $pdf = Pdf::loadView('pdf.song', [ - 'song' => $song, - 'arrangement' => $arrangement, - 'groupsInOrder' => $groupsInOrder, - ]); + $pdf = Pdf::loadView('pdf.song', [ + 'song' => $song, + 'arrangement' => $arrangement, + 'groupsInOrder' => $groupsInOrder, + ])->setPaper('a4', 'portrait'); - $filename = str($song->title)->slug() . '-' . str($arrangement->name)->slug() . '.pdf'; + $filename = str($song->title)->slug().'-'.str($arrangement->name)->slug().'.pdf'; - return $pdf->download($filename); + return $pdf->download($filename); + } catch (\Throwable $e) { + return response()->json([ + 'message' => 'PDF-Erzeugung fehlgeschlagen: '.$e->getMessage(), + ], 500); + } } private function buildGroupsInOrder(SongArrangement $arrangement): array diff --git a/resources/js/Components/ArrangementConfigurator.vue b/resources/js/Components/ArrangementConfigurator.vue index 0079777..9922513 100644 --- a/resources/js/Components/ArrangementConfigurator.vue +++ b/resources/js/Components/ArrangementConfigurator.vue @@ -1,5 +1,5 @@