diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 6f0b176..4cce480 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -111,7 +111,7 @@ Plans: | 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 | | 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 | | 10. Branding Data Foundation | v2.2 | 3/3 | Complete | 2026-04-08 | -| 11. HTML Export Branding + ViewModel Integration | 1/4 | In Progress| | — | +| 11. HTML Export Branding + ViewModel Integration | 2/4 | In Progress| | — | | 12. Branding UI Views | v2.2 | 0/? | Not started | — | | 13. User Directory ViewModel | v2.2 | 0/? | Not started | — | | 14. User Directory View | v2.2 | 0/? | Not started | — | diff --git a/.planning/phases/11-html-export-branding/11-04-SUMMARY.md b/.planning/phases/11-html-export-branding/11-04-SUMMARY.md new file mode 100644 index 0000000..1f8cb09 --- /dev/null +++ b/.planning/phases/11-html-export-branding/11-04-SUMMARY.md @@ -0,0 +1,99 @@ +--- +phase: 11-html-export-branding +plan: 04 +subsystem: ui +tags: [wpf, mvvm, graph-api, entra, branding, logo] + +requires: + - phase: 10-branding-data-foundation + provides: IBrandingService, BrandingService, ProfileService, LogoData, GraphClientFactory +provides: + - UpdateProfileAsync on ProfileService for persisting profile changes + - ImportLogoFromBytesAsync on IBrandingService for raw byte validation + - BrowseMspLogoCommand and ClearMspLogoCommand on SettingsViewModel + - BrowseClientLogoCommand, ClearClientLogoCommand, AutoPullClientLogoCommand on ProfileManagementViewModel +affects: [phase-12-logo-ui-preview] + +tech-stack: + added: [] + patterns: [auto-pull-entra-branding, logo-command-pattern] + +key-files: + created: + - SharepointToolbox.Tests/ViewModels/SettingsViewModelLogoTests.cs + - SharepointToolbox.Tests/ViewModels/ProfileManagementViewModelLogoTests.cs + modified: + - SharepointToolbox/Services/ProfileService.cs + - SharepointToolbox/Services/IBrandingService.cs + - SharepointToolbox/Services/BrandingService.cs + - SharepointToolbox/ViewModels/Tabs/SettingsViewModel.cs + - SharepointToolbox/ViewModels/ProfileManagementViewModel.cs + +key-decisions: + - "GraphClientFactory is not mockable (non-virtual) — tests use real instance without calling CreateClientAsync" + - "ImportLogoAsync refactored to delegate to ImportLogoFromBytesAsync — eliminates code duplication" + - "Type alias AppGraphClientFactory used to disambiguate from Microsoft.Graph.GraphClientFactory" + +patterns-established: + - "Logo command pattern: browse → ImportLogoAsync → persist; clear → null + persist" + - "Auto-pull pattern: Graph API org branding → ImportLogoFromBytesAsync → persist to profile" + +requirements-completed: [BRAND-04, BRAND-05] + +duration: 12min +completed: 2026-04-08 +--- + +# Plan 11-04: Logo Management Commands + Service Extensions Summary + +**MSP and client logo browse/clear/auto-pull commands on ViewModels, with ProfileService.UpdateProfileAsync and BrandingService.ImportLogoFromBytesAsync** + +## Performance + +- **Duration:** ~12 min +- **Tasks:** 2 +- **Files modified:** 8 + +## Accomplishments +- ProfileService.UpdateProfileAsync persists profile changes (find-by-name, replace, save) +- BrandingService.ImportLogoFromBytesAsync validates raw bytes via magic byte detection, reuses compression logic +- ImportLogoAsync now delegates to ImportLogoFromBytesAsync (no duplication) +- SettingsViewModel exposes BrowseMspLogoCommand, ClearMspLogoCommand, MspLogoPreview property +- ProfileManagementViewModel exposes BrowseClientLogoCommand, ClearClientLogoCommand, AutoPullClientLogoCommand +- Auto-pull fetches squareLogo from Entra branding API, handles 404 gracefully +- All commands gated on SelectedProfile != null (CanExecute) + +## Task Commits + +1. **Task 1: UpdateProfileAsync + ImportLogoFromBytesAsync** - `9e850b0` (feat) +2. **Task 2: Logo management commands on ViewModels** - `b02b75e` (feat) + +## Files Created/Modified +- `SharepointToolbox/Services/ProfileService.cs` - Added UpdateProfileAsync +- `SharepointToolbox/Services/IBrandingService.cs` - Added ImportLogoFromBytesAsync +- `SharepointToolbox/Services/BrandingService.cs` - Implemented ImportLogoFromBytesAsync, refactored ImportLogoAsync +- `SharepointToolbox/ViewModels/Tabs/SettingsViewModel.cs` - Added IBrandingService injection, MSP logo commands +- `SharepointToolbox/ViewModels/ProfileManagementViewModel.cs` - Added branding/graph injection, client logo commands +- `SharepointToolbox.Tests/ViewModels/SettingsViewModelLogoTests.cs` - 4 tests for MSP logo commands +- `SharepointToolbox.Tests/ViewModels/ProfileManagementViewModelLogoTests.cs` - 7 tests for client logo commands + +## Decisions Made +- GraphClientFactory cannot be mocked with Moq (non-virtual methods) — used real instance in tests, auto-pull not tested E2E +- Used type alias `AppGraphClientFactory` to avoid conflict with Microsoft.Graph.GraphClientFactory + +## Deviations from Plan +None - plan executed as specified. + +## Issues Encountered +- Agent hit permission wall during test file creation; completed manually by orchestrator. + +## User Setup Required +None - no external service configuration required. + +## Next Phase Readiness +- SettingsViewModel and ProfileManagementViewModel ready for Phase 12 UI integration +- All logo management commands exercisable without View + +--- +*Phase: 11-html-export-branding* +*Completed: 2026-04-08*