Honor per-service arrangement selection in ProPresenter export:
- .pro selected_arrangement (protobuf field 10) via existing parser API
- .proplaylist item arrangement_name (field 5), import-stable by name
- buildGroups emits union of all arrangements' sections
Conflict in PlaylistExportService.php (agenda song branch) resolved by
applying arrangement selection inside master's new else-block; legacy
path and ProExport/ProBundle changes auto-merged. All 63 export tests
pass against the hot-patched vendor.
Update anonymous PlaylistExportService subclasses in export tests to match
the production writeProFile signature (added $options param) and to inject
the now-required MacroResolutionService constructor dependency.
ProPresenter export ignored service_songs.song_arrangement_id and
always used the default/is_default arrangement. Now the chosen
arrangement is pre-selected while ALL arrangements stay in the file,
so users can still switch in ProPresenter.
Import-stable, by NAME (avoids the fragile playlist arrangement UUID
that breaks on import):
- .pro: set selected_arrangement (protobuf field 10) to the chosen
arrangement via Song::setSelectedArrangementUuid(getArrangementByName).
- .proplaylist: set the presentation item arrangement_name (field 5).
buildGroups now emits the UNION of sections across all arrangements
(selected first, in play order, with first/last-slide macro anchoring;
other arrangements' sections appended without position macros) so every
arrangement's group-name refs resolve instead of being silently dropped.
No parser package changes; installed public API only. Library/no-service
context keeps default-arrangement behaviour unchanged.
Add new part type 'abspann' (credits/Abspann presentation) to the macro
assignment enum, validation and UI.
- Relax part_type from enum to plain string on macro_assignments,
service_macro_overrides and service_macro_assignments so 'abspann' (and
any controller-validated value) is accepted across MySQL and SQLite.
- Add 'abspann' to Rule::in validation in MacroAssignmentController and
ServiceMacroOverrideController.
- Include 'abspann' in the per-service macros_per_part list in
ServiceController so the override UI exposes it.
- Add 'abspann' to the parts array in Settings/MacroAssignments.vue
(by_label stays song-only; abspann offers all/first/last slide).
- add explicit confirmed_at assignment state (red/amber/green) with confirm/unconfirm endpoints
- clone leader arrangement before opening dialog to avoid flicker
- agenda slide strip: show all previews, drag-reorder, number badges, auto-hide uploader
- fix info-slide expire-date saving via axios (was rendering raw JSON modal)
- point top-left logo to / instead of /dashboard
- 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).
Resolves a batch of bugs and feature requests across songs, services,
settings and export:
Songs & sections
- Every song now carries permanent, empty, locked PREFIX (COPYRIGHT) and
POSTFIX (BLANK) sections, deduplicated on import; locked sections cannot
be edited or deleted via UI or API.
- Song edit modal: explicit Speichern/Schließen with dirty-tracking,
editable section headline (combobox + custom values), and a fix for the
419 CSRF errors after CCLI "Importieren & Bearbeiten" (token read fresh
per request).
- CCLI bookmarklet "Importieren & Bearbeiten" now opens the edit dialog.
Service schedule & arrangements
- Fixed assigned songs showing no sections (slides loaded for all
arrangements, not just the default).
- Added "Song entfernen / neu zuordnen" to reassign an assigned song.
- Worship-leader arrangement is created/selected lazily when the
arrangement dialog opens (only when not user-overridden); the leader is
resolved from the "Lobpreis" agenda item, and manual create/clone names
are prefixed with the leader name.
Navigation
- "/" redirects to the next upcoming service's edit page (or the list).
- Service titles link to the edit page.
Settings
- Renamed "Makro-Import"/"Label-Import" menu items; fixed drag-and-drop
imports (were downloading the dropped file); added label-import hint;
made the panel scrollable.
- Nametag now uses a single MacroPicker; added song prefix/postfix label
defaults (COPYRIGHT #24B34C / BLANK #000000); new "Export-Dateien" menu
to upload prefix/postfix .pro files added to every export.
Export
- Filenames/playlist names are date-first ("YYYY-MM-DD <Title>").
- Keyvisual slide only for the first content-less item after real content;
all other content-less items render as headlines.
- New "Vorschau herunterladen" for non-finalized services (filename and
import name prefixed "Vorschau" with export timestamp).
- Uploaded prefix/postfix .pro files wrap every export.
Tests updated to the new behavior; full suite green (569 passed).
- CCLI import: group lyrics into 2-line slides (no blank line per line)
- Add-section: searchable label combobox with create-new option
- Service edit: show current global key-visual/background default live
- Assign dialog: prefill+open search, SongSelect link by CCLI nr/name
- "Auf SongSelect suchen" now also opens the CCLI import dialog
- SongDB: mark empty songs "Ohne Inhalt", default-on content filter
- Translation paste: strip section-mark lines so line mapping holds
Enable storage-backed key visuals and background images plus service-specific moderator and preacher name overrides.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- MacroImportController + LabelImportController: POST endpoints accepting uploaded .bin files,
delegating to MacrosImportService / LabelsImportService and returning import stats / warnings as JSON.
Generic German 422 error if parser rejects the file.
- MacroAssignmentController: index renders Settings Inertia page with assignments / macros / labels /
collections / last-import metadata. store/update/destroy/reorder for global MacroAssignment rows.
- ServiceMacroOverrideController: store snapshots all matching global MacroAssignments into
service-specific rows when a service opts to override; destroy removes both override and
service-specific assignments. storeAssignment / updateAssignment / destroyAssignment manage the
per-service rows directly.
- routes/web.php: 12 new named routes inside the auth middleware group; reorder route placed before
{macroAssignment} parameter route to avoid capture conflict.
- Tests: 19 new Pest tests across 4 feature files (54 assertions). Full suite 376 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