4.9 KiB
4.9 KiB
Draft: .pro Generation Improvements + UI Fixes
Requirements (confirmed)
Request #14 — .pro Generation Improvements (5 sub-tasks)
- Remove slide attributes: background/fill, border/stroke, smooth border/feather, scroll/textScroller from
ProFileGenerator::buildSlideElement() - Add macro to COPYRIGHT slide: macro selectable in global settings UI. Macro structure:
['name', 'uuid', 'collectionName', 'collectionUuid'] - Set arrangement 'normal' as selected: In
ProFileGenerator::generate(), currently selects first arrangement. Need to find 'normal' and select it. - Two textboxes for translated slides: Per
ref/TestTranslated.pro— exact naming and positioning TBD from research - Export service slides as .probundle: information, moderation, sermon blocks → .probundle (zip with .pro + images)
Request #12 — UI Improvements (3 tasks, analyzed not implemented)
- Slide drag highlight: ghostClass/chosenClass/dragClass + CSS on SlideGrid.vue
- Default arrangement auto-persist: SongMatchingService auto-sets 'normal' arrangement on match
- Finalize + "Finalize & Download" buttons: Port from Index.vue to Edit.vue, sticky bottom bar
Technical Decisions
- All frontend wording in German (Du, not Sie)
- Every action immediately persistent
- CTS API is READ-ONLY
Research Findings
Agent 2 — UI State (completed)
- SlideGrid.vue: Uses vue-draggable-plus. Add ghost-class/chosen-class/drag-class props at line 207-215. Add scoped styles at 453-465.
- SongMatchingService.php: Lines 34-38 (autoMatch) + 47-54 (manualAssign) — insert arrangement auto-select after song_id is set
- Edit.vue: 4 collapsible blocks. Insert finalize buttons after line 344 (sticky footer)
- Index.vue: Has complete finalize flow: finalizeService() lines 69-95, confirmFinalize() lines 97-119, reopenService() lines 127-132
- ServiceController.php: finalize() lines 224-245, reopen() lines 247-256, download() lines 269-289
- Routes: POST /services/{service}/finalize, POST /services/{service}/reopen, GET /services/{service}/download
Agent 3 — Settings Infrastructure (completed)
- NO settings infrastructure exists — no model, table, controller, or UI
- Current config uses
.env+config/services.php(static, not DB-backed) - Song request email:
Config::get('services.song_request.email')in SongMatchingService line 63 - Navigation in
AuthenticatedLayout.vuelines 95-126: Services, Song-Datenbank, API-Log - Shared Inertia props in
HandleInertiaRequests.php: auth.user, flash, last_synced_at, app_name - Recommendation: Build DB-backed settings table (key-value) + Settings controller + Vue page + nav item
Agent 1 — ProPresenter Module (completed)
- Textbox names:
"Orginal"(intentional typo!) and"Deutsch"— both use IDENTICAL bounds: origin (150,100) size (1620x880). They're OVERLAID, not split. - User said "take attention of naming and exact position" — the ref file TestTranslated.pro needs to be read via ProFileReader to confirm if the actual ref file uses different positioning than the generator defaults. The agent couldn't read the binary directly.
- .probundle: NOT IMPLEMENTED — zero references in entire codebase. Must be built from scratch. A .probundle is a ZIP containing a .pro file + image files.
- Reference files found: Test.pro, TestTranslated.pro, TestMitMakro.pro, TestMitBildernUndMakro.pro in
/Users/thorsten/AI/propresenter-work/ref/ - Full spec:
/Users/thorsten/AI/propresenter-work/spec/pp_song_spec.md(776 lines) - Macro attachment: Macros are additional actions on cues. buildMacroAction() at lines 206-227. Needs: name, uuid, collectionName, collectionUuid
- ProFileGenerator API: generate() and generateAndWrite() accept name, groups[], arrangements[], ccli[]
- Attributes to remove: buildFill(), buildStroke(), buildShadow(), buildFeather() called in buildSlideElement(); buildTextScroller() called in buildCue()
- Arrangement selection: generate() currently uses $arrangementProtos[0] (first). Need to find 'normal' by name.
- Media actions: Require absolute file URLs (
file:///tmp/image.jpg) + format string ('JPG', 'PNG'). buildMediaAction() already exists.
Open Questions (resolved)
- ✅ Textbox names: "Orginal" and "Deutsch" (both overlaid with same bounds)
- ✅ .probundle: Does NOT exist, must build from scratch
- ✅ Macro structure: 4 fields needed (name, uuid, collectionName, collectionUuid)
- ⚠️ NEED TO VERIFY: Does TestTranslated.pro actually use different textbox positioning than the generator? User explicitly asked to check this.
- ⚠️ NEED DECISION: For macro settings UI, user needs to provide UUIDs from their ProPresenter installation. How should we surface this?
Scope Boundaries
- INCLUDE: All 5 sub-tasks of Request #14 + 3 tasks of Request #12 + Settings infrastructure
- EXCLUDE: .pro file parser module changes (unless needed for .probundle), song file upload parsing