Files
Sharepoint-Toolbox/.planning/STATE.md
Dev 188a8a7fff docs(10-02): complete Graph user directory service plan
- SUMMARY: GraphDirectoryUser model, IGraphUserDirectoryService, GraphUserDirectoryService with PageIterator
- STATE: decisions added, session updated, progress bar updated
- ROADMAP: phase 10 marked In Progress (2/3 summaries)
- REQUIREMENTS: BRAND-06 marked complete
- Deferred: BrandingServiceTests.cs blocking test compilation (pre-existing, plan 10-01 artifact)
2026-04-08 12:33:33 +02:00

76 lines
3.8 KiB
Markdown

---
gsd_state_version: 1.0
milestone: v2.2
milestone_name: Report Branding & User Directory
status: planning
stopped_at: Completed 10-branding-data-foundation-02-PLAN.md
last_updated: "2026-04-08T10:33:30.250Z"
last_activity: 2026-04-08 — Roadmap created for v2.2
progress:
total_phases: 5
completed_phases: 0
total_plans: 3
completed_plans: 2
---
# Project State
## Project Reference
See: .planning/PROJECT.md (updated 2026-04-08)
**Core value:** Administrators can audit and manage SharePoint/Teams permissions and storage across multiple client tenants from a single, reliable desktop application.
**Current focus:** v2.2 Report Branding & User Directory — HTML report logos (Phases 10-12), user directory browse mode (Phases 13-14)
## Current Position
Phase: 10 (not started)
Plan: —
Status: Roadmap ready — awaiting phase planning
Last activity: 2026-04-08 — Roadmap created for v2.2
```
v2.2 Progress: [░░░░░░░░░░] 0% (0/5 phases)
```
## Accumulated Context
### Decisions
Decisions are logged in PROJECT.md Key Decisions table.
**v2.2 architectural decisions (locked at roadmap):**
- Logos stored as base64 strings in JSON (not file paths). `BrandingSettings.cs` holds MSP logo; `TenantProfile` holds client logo. File path is discarded after import. This decision is locked — all downstream phases depend on it.
- Client logo lives on `TenantProfile`, NOT in `BrandingSettings`. Per-tenant ownership; prevents serialization and deletion awkwardness.
- Export services use optional `ReportBranding? branding = null` parameter. All existing call sites compile unchanged. No new `IHtmlExportService` interface needed.
- `GraphUserDirectoryService` is a new service, separate from `GraphUserSearchService`. Different pagination model (`PageIterator`), different cancellation needs.
- Directory does NOT load automatically on tab open. Explicit "Load Directory" button required to avoid blocking UI on large tenants.
- SVG logo support: rejected. XSS risk in data-URIs. PNG/JPG only.
- No new NuGet packages for v2.2. All capabilities provided by existing stack (BCL, Microsoft.Graph 5.74.0, WPF PresentationCore).
**v1.1 architectural notes (carried forward):**
- Global site selection (Phase 6) changes the toolbar; all tabs bind to shared `GlobalSiteSelectionViewModel`. `WeakReferenceMessenger` for cross-tab site-changed notifications.
- Per-tab override (SITE-02): each `FeatureViewModelBase` subclass stores a nullable local site override; null means "use global".
- Storage Visualization (Phase 9): LiveCharts2, WPF-native, self-contained friendly.
- [Phase 10-branding-data-foundation]: No ConsistencyLevel header on equality filter for GetUsersAsync (unlike GraphUserSearchService startsWith which requires it)
- [Phase 10-branding-data-foundation]: MapUser extracted as internal static in GraphUserDirectoryService for direct unit testability without live Graph endpoint
- [Phase 10-branding-data-foundation]: Type alias AppGraphClientFactory used in GraphUserDirectoryService to disambiguate from Microsoft.Graph.GraphClientFactory
### Pending Todos
- Confirm `$filter=accountEnabled eq true and userType eq 'Member'` behavior without `ConsistencyLevel: eventual` against a real tenant before Phase 13 planning.
- Verify Entra `bannerLogo` stream endpoint returns empty body (not HTTP 404) when no tenant branding is configured — determines error handling branch for BRAND-04 auto-pull.
- Decide report header layout before Phase 11: logos side-by-side (current spec: `display: flex; gap: 16px`, MSP left + client right).
- Decide "Load Directory" button placement before Phase 14: inside browse panel (recommended) or tab-level toolbar.
### Blockers/Concerns
None.
## Session Continuity
Last session: 2026-04-08T10:33:19.924Z
Stopped at: Completed 10-branding-data-foundation-02-PLAN.md
Resume file: None
Next step: `/gsd:plan-phase 10`