docs(11-04): complete logo management commands plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -111,7 +111,7 @@ Plans:
|
|||||||
| 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 |
|
| 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 |
|
||||||
| 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 |
|
| 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 |
|
||||||
| 10. Branding Data Foundation | v2.2 | 3/3 | Complete | 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 | — |
|
| 12. Branding UI Views | v2.2 | 0/? | Not started | — |
|
||||||
| 13. User Directory ViewModel | v2.2 | 0/? | Not started | — |
|
| 13. User Directory ViewModel | v2.2 | 0/? | Not started | — |
|
||||||
| 14. User Directory View | v2.2 | 0/? | Not started | — |
|
| 14. User Directory View | v2.2 | 0/? | Not started | — |
|
||||||
|
|||||||
99
.planning/phases/11-html-export-branding/11-04-SUMMARY.md
Normal file
99
.planning/phases/11-html-export-branding/11-04-SUMMARY.md
Normal file
@@ -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*
|
||||||
Reference in New Issue
Block a user