Commit graph

69 commits

Author SHA1 Message Date
Thorsten Bus 6061e4c4dd feat(service): add image columns and overrides
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>
2026-05-31 00:01:24 +02:00
Thorsten Bus 73a523d0e1 feat(images): cover-fit conversion mode 2026-05-30 23:56:05 +02:00
Thorsten Bus e7ad1b3cce chore: commit pint style fix, CCLI-API.md planning doc, and npm lock update 2026-05-11 11:00:50 +02:00
Thorsten Bus 8a2e250f14 fix(ccli): remove empty if block in CcliPasteParser constructor 2026-05-11 10:47:10 +02:00
Thorsten Bus d77eb6ad1e feat(translate): accept prefilled translation from CCLI pairing 2026-05-11 10:29:52 +02:00
Thorsten Bus 35d3298251 feat(ccli): add CcliPasteController endpoints
- POST /api/ccli/preview: parse-only endpoint (no DB writes)
- POST /api/songs/import-from-ccli-paste: 3 modes (create / pair-with-song / assign-to-service-song)
- GET /songs/import-from-ccli-paste: Inertia page with base64 bookmarklet prefill
- Routes guarded by auth:sanctum + throttle:30,1 (API); auth + web stack (web)
- Maps DuplicateCcliSongException to 409 with existing_song_id and edit_url
- Pest tests (10 cases, 63 assertions): preview, all 3 import modes, 409 dup, 422 errors, unauth, prefill happy/error, login redirect
2026-05-11 09:23:11 +02:00
Thorsten Bus cd0a72124d feat(ccli): serve CCLI bookmarklet JS 2026-05-10 19:34:30 +02:00
Thorsten Bus cd44d6289c feat(ccli): add CcliTranslationPairingService
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-10 19:02:10 +02:00
Thorsten Bus 091e00f255 feat(ccli): add CcliImportService for song upsert
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-10 18:56:38 +02:00
Thorsten Bus e4e5df912e fix(ccli): parse common CCLI metadata 2026-05-10 18:54:33 +02:00
Thorsten Bus 9412ca71c9 feat(ccli): implement CcliPasteParser parsing logic 2026-05-10 18:49:18 +02:00
Thorsten Bus 55a3ea3df8 feat(ccli): scaffold CcliPasteParser service 2026-05-10 18:42:21 +02:00
Thorsten Bus 85608f774d feat(settings): add default translation language setting 2026-05-10 18:38:14 +02:00
Thorsten Bus 73b7afcc2f feat(songs): track CCLI import metadata on songs table 2026-05-10 18:33:24 +02:00
Thorsten Bus 5c590eda9e feat(ccli): add section-label constants and language mapping 2026-05-10 18:28:18 +02:00
Thorsten Bus eee35722fb fix(export): inject macros for information/moderation/sermon/agenda_item parts
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-04 06:48:17 +02:00
Thorsten Bus 84adf2b6fb fix: add hidden-label warning badge, use null color fallback in ProImportService 2026-05-04 06:41:05 +02:00
Thorsten Bus 41d4bfe2b7 fix: rename song_group_id to label_id in Vue, add data-testid to MacroIcon, fix Pint style 2026-05-04 06:33:04 +02:00
Thorsten Bus 6d83b5f38c feat(service-edit): macro icon + Anpassen/Standard flow on service edit page 2026-05-04 00:37:05 +02:00
Thorsten Bus b88ae3e918 feat(settings): SettingsController passes assignments, macros, labels, collections to Settings page 2026-05-04 00:26:56 +02:00
Thorsten Bus 6ce5b6e018 feat(controllers): add macro/label import + global assignment + service override controllers and routes
- 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.
2026-05-03 23:17:04 +02:00
Thorsten Bus cef247336e feat(export): use MacroResolutionService in ProExportService for flexible macro injection 2026-05-03 23:08:22 +02:00
Thorsten Bus 81b2a9caf6 feat(services): add LabelsImportService, MacrosImportService, MacroResolutionService 2026-05-03 23:03:32 +02:00
Thorsten Bus bdbf0c65e3 refactor(php): rename SongGroup references throughout controllers/services/tests
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
2026-05-03 22:55:02 +02:00
Thorsten Bus a1612dc3ef feat(support): add MacroColorConverter utility 2026-05-03 22:31:44 +02:00
Thorsten Bus 846bd12f90 feat(models): add Label/Macro/MacroAssignment/ServiceMacro models and remove SongGroup 2026-05-03 22:27:21 +02:00
Thorsten Bus 0d7e150fe2 fix: add missing CTLog import in ChurchToolsService 2026-03-31 14:18:01 +02:00
Thorsten Bus 936d38ecdc fix: disable ChurchTools API file logging to prevent vendor/ write errors 2026-03-31 13:58:03 +02:00
Thorsten Bus 2ba612072f fix: resolve 17 pre-existing test failures (path refs, Mockery alias mocks)
- Update propresenter ref path from ../propresenter-work/ to ../propresenter/
- Fix ProFileImportTest assertion for CCLI-based upsert behavior
- Replace Mockery alias mocks with testable subclass pattern in
  PlaylistExportTest, eliminating @runInSeparateProcess requirement
- Use DI (app()) for PlaylistExportService in controller for testability
- All 302 tests pass (was 285 pass + 17 fail)
2026-03-30 12:43:50 +02:00
Thorsten Bus 0e3c647cfc feat: probundle export with media, image upscaling, upload dimension warnings
- 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)
2026-03-30 10:29:37 +02:00
Thorsten Bus 41426ff25b add better errorhandling for cts sync 2026-03-29 15:24:13 +02:00
Thorsten Bus 4c119b647d feat: add has_agenda flag to services and guard agenda sync
Events without an agenda in ChurchTools now gracefully set has_agenda=false
instead of throwing errors during sync. The edit/finalize buttons are
disabled in the frontend for services without an agenda.

Also fixes missing cts_song_id column on service_songs table.
2026-03-29 15:22:32 +02:00
Thorsten Bus e88079e211 feat(ui): update service list status columns for agenda model 2026-03-29 12:18:50 +02:00
Thorsten Bus 45955b70a2 feat(ui): add slide upload on agenda items 2026-03-29 12:12:58 +02:00
Thorsten Bus de431d29cc feat(export): agenda-ordered playlist export 2026-03-29 11:59:38 +02:00
Thorsten Bus 88661c6bef feat(sync): sync all CTS agenda items (not just songs) 2026-03-29 11:54:50 +02:00
Thorsten Bus 0b671956d6 feat(controller): pass agenda items to edit page 2026-03-29 11:48:28 +02:00
Thorsten Bus 2d70026a20 refactor(model): update finalizationStatus for agenda model 2026-03-29 11:46:54 +02:00
Thorsten Bus 7a71b8b2de chore(debug): add CTS agenda type discovery command 2026-03-29 11:39:24 +02:00
Thorsten Bus 1f367b6f37 feat(settings): add agenda configuration keys 2026-03-29 11:37:33 +02:00
Thorsten Bus 03224ffa06 feat(service): add AgendaMatcherService with wildcard namesmatching 2026-03-29 11:37:06 +02:00
Thorsten Bus 31d7634dbf feat(db): add service_agenda_items table + slides FK migration 2026-03-29 11:34:55 +02:00
Thorsten Bus 044b94b080 refactor(export): use in-memory content for zip bundle and playlist entries
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.
2026-03-06 10:25:21 +01:00
Thorsten Bus af0c72ebcc 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.
2026-03-02 23:02:51 +01:00
Thorsten Bus b40c371edc feat(export): embed slide blocks in playlist and add roundtrip test
Add information, moderation, and sermon slide presentations as .pro
files in the generated .proplaylist bundle. Each block queries slides
by type/service, converts stored images, and generates a ProPresenter
presentation via ProFileGenerator.

Add test_download_pro_roundtrip_preserves_content that imports a .pro
file, exports it, re-reads with the parser, and asserts song name,
groups, slides, translations, arrangements, and CCLI metadata survive
the round-trip.
2026-03-02 23:02:30 +01:00
Thorsten Bus bef910b126 feat(slides): add sort_order column, bulk delete, and reorder endpoints
Add sort_order to slides table with migration and model fillable.
Add destroyBulk() for batch soft-delete by type/service_id and
reorder() for drag-and-drop slide ordering. Auto-assign sort_order
on image and zip uploads.
2026-03-02 23:02:19 +01:00
Thorsten Bus 04d271f96a style: apply Laravel Pint formatting across codebase
Auto-formatted by Laravel Pint (default Laravel preset): string
concatenation spacing, anonymous class brace placement, constructor
body shorthand, import ordering, and assertion indentation.
2026-03-02 23:02:03 +01:00
Thorsten Bus 5b35afb31d feat(export): add probundle export for service slide blocks
- Create ProBundleExportService with generateBundle() method
- Generate flat ZIP with .pro file + image files at root level
- Add downloadBundle() method to ServiceController
- Add services.download-bundle route
- Add .probundle download buttons to Information, Moderation, Sermon blocks
- Add 3 tests verifying ZIP structure and validation
- All tests pass (206/206, 1129 assertions)
2026-03-02 22:18:33 +01:00
Thorsten Bus fefa761748 feat(settings): add macro configuration infrastructure
- 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
2026-03-02 22:00:19 +01:00
Thorsten Bus 6543133713 feat(songs): auto-select default arrangement on song match 2026-03-02 21:22:30 +01:00