- New SlideMediaElementBuilder converts FOREGROUND (uploaded) image media
actions into slide-content fill.media elements placed at the top of the
slide content, so uploaded information/moderation/sermon images render as
real content rather than a media-layer action.
- Service background and key-visual images remain BACKGROUND media actions on
the bottom layer; song text and name-tag stay text content elements.
- Wire the builder into ProExportService and ProBundleExportService (after
generate) and split PlaylistExportService::writeProFile into
generate -> inject -> write via ProFileWriter so the playlist path applies
the same rule.
- Parser library unchanged.
- Migrate export tests to the combined rule via a shared InspectsSlideFillMedia
support trait and add SlideMediaElementTest.
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.
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)
Replace file-path-based zip entries with in-memory content via
file_get_contents. Rename .pro entry to 'data' (raw protobuf),
add addStoredEntry() helper with CM_STORE compression, and remove
temp directory management.