From b36ed6e221fe2ae99aa73182abef75bcb6ec06ba Mon Sep 17 00:00:00 2001 From: Thorsten Bus Date: Sun, 31 May 2026 03:41:24 +0200 Subject: [PATCH] feat(ui): name overrides + namenseinblender setting --- app/Http/Controllers/ServiceController.php | 14 ++++++ resources/js/Pages/Services/Edit.vue | 42 +++++++++++++++++ resources/js/Pages/Settings.vue | 55 ++++++++++++++++++++++ routes/web.php | 1 + 4 files changed, 112 insertions(+) diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php index cc99546..e06e61f 100644 --- a/app/Http/Controllers/ServiceController.php +++ b/app/Http/Controllers/ServiceController.php @@ -269,6 +269,8 @@ public function edit(Service $service): Response 'background_filename' => $service->background_filename, 'key_visual_url' => $service->key_visual_filename ? '/storage/'.$service->key_visual_filename : null, 'background_url' => $service->background_filename ? '/storage/'.$service->background_filename : null, + 'moderator_name' => $service->moderator_name, + 'preacher_name_override' => $service->preacher_name_override, ], 'serviceSongs' => $service->serviceSongs->map(fn ($ss) => [ 'id' => $ss->id, @@ -367,6 +369,18 @@ public function finalize(Service $service): JsonResponse ]); } + public function updateNameOverrides(Request $request, Service $service): RedirectResponse + { + $validated = $request->validate([ + 'moderator_name' => ['nullable', 'string', 'max:255'], + 'preacher_name_override' => ['nullable', 'string', 'max:255'], + ]); + + $service->update($validated); + + return back()->with('success', 'Namensangaben gespeichert.'); + } + public function reopen(Service $service): RedirectResponse { $service->update([ diff --git a/resources/js/Pages/Services/Edit.vue b/resources/js/Pages/Services/Edit.vue index 00f086f..8e1210a 100644 --- a/resources/js/Pages/Services/Edit.vue +++ b/resources/js/Pages/Services/Edit.vue @@ -98,6 +98,12 @@ function refreshPage() { router.reload({ preserveScroll: true }) } +function updateNameOverride(field, value) { + router.patch(route('services.name-overrides.update', { service: props.service.id }), { + [field]: value || null, + }, { preserveScroll: true }) +} + function scrollToInfoBlock() { informationBlockRef.value?.scrollIntoView({ behavior: 'smooth', block: 'start' }) } @@ -406,6 +412,42 @@ async function downloadService() { + +
+
+
+
+ + +
+
+ + +
+
+
+
+
diff --git a/resources/js/Pages/Settings.vue b/resources/js/Pages/Settings.vue index b1ff826..dc81bfd 100644 --- a/resources/js/Pages/Settings.vue +++ b/resources/js/Pages/Settings.vue @@ -23,6 +23,7 @@ const submenus = [ { key: 'labels', label: 'Label-Import' }, { key: 'agenda', label: 'Agenda' }, { key: 'ccli', label: 'CCLI Import' }, + { key: 'namenseinblender', label: 'Namenseinblender' }, ] const activeSubmenu = ref('assignments') @@ -222,6 +223,60 @@ async function updateSetting(key, value) {
+ + +
+
+

Namenseinblender-Makro

+

+ Konfiguriere das ProPresenter-Makro, das für die Namenseinblendung bei Moderation und Predigt verwendet wird. Wenn kein Makro konfiguriert ist, werden keine Namensfolien generiert. +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
diff --git a/routes/web.php b/routes/web.php index 876eb8b..4abf60e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -70,6 +70,7 @@ Route::get('/services/{service}/edit', [ServiceController::class, 'edit'])->name('services.edit'); Route::post('/services/{service}/key-visual', [ServiceImageController::class, 'storeKeyVisual'])->name('services.key-visual.store'); Route::post('/services/{service}/background', [ServiceImageController::class, 'storeBackground'])->name('services.background.store'); + Route::patch('/services/{service}/name-overrides', [ServiceController::class, 'updateNameOverrides'])->name('services.name-overrides.update'); Route::get('/songs/{song}/translate', [TranslationController::class, 'page'])->name('songs.translate'); Route::get('/songs', function () {