- Post-login (OAuth + dev-login) now redirects to the next upcoming
service's edit page instead of /dashboard, mirroring the GET / route.
- NameTagResolver now reads the real ChurchTools `responsible` shape
(persons[].person.title) and resolves moderator/preacher/worship-leader
by responsible ROLE ([Moderation]/[Predigt]/[Lobpreis]). This fixes
missing name slides and makes the worship-leader arrangement trigger
(e.g. service 12 → "Benedikt Hardt" / "Jennifer Schneider").
- NameTagSlideBuilder no longer silently drops the name slide when the
configured macro id points to a missing macro; it emits the slide
without a macro instead.
- Song export: the "first slide" / "last slide" macro now applies only to
the song's very first/last slide (global slide index across all
sections), not the first slide of every section.
- Export "headlines" for content-less agenda items are now emitted as
proper ProPresenter playlist HEADER items instead of text presentations.
- Prefix/postfix export files now also accept .probundle (unzipped: inner
.pro + media embedded) in addition to .pro, both for upload validation
and export injection.
Full suite green (587 passed).
Replace all SongGroup/SongArrangementGroup model usages with Label/SongArrangementLabel
after the schema migration to global labels. Updates 12 app files and 11 test files:
- SongService: createDefaultGroups now finds-or-creates global Labels by name
- ArrangementController: validates label_id (labels are global, no song-ownership)
- ProImportService: imports groups as Labels (firstOrCreate by name); does not
overwrite existing label colors per spec
- ProExportService/SongPdfController/TranslationService/etc: traverse via
arrangements -> arrangementLabels -> label -> songSlides chain
- All test factories and assertions adapted to label-based schema
- Fix probundle exports missing images (double slides/ prefix in storage path)
- Replace manual ZipArchive with PresentationBundle + ProBundleWriter from parser plugin
- Add per-agenda-item download route and buttons for songs and slide items
- Remove text layer from image-only slides in .pro generation
- Fix image conversion: upscale small images, black bars on 2 sides max (contain)
- Add upload warnings for non-16:9 and sub-1920x1080 images (German, non-blocking)
- Update SlideFactory and all tests to use slides/ prefix in stored_filename
- Add 11 new tests (agenda download, image conversion, upload warnings)
- Migration: settings table with key (unique), value (text), timestamps
- Model: Setting with static get/set helpers using DB upsert
- Controller: SettingsController with index (Inertia) and update (JSON)
- Vue: Settings page with 4 macro fields, auto-save on blur
- Navigation: Einstellungen link in desktop + mobile nav after API-Log
- Shared props: macroSettings added to HandleInertiaRequests
- Integration: ProExportService injects macro into COPYRIGHT group slides
- Gracefully skips macro injection when settings empty/null