Archive 5 phases (36 plans) to milestones/v1.0-phases/. Archive roadmap, requirements, and audit to milestones/. Evolve PROJECT.md with shipped state and validated requirements. Collapse ROADMAP.md to one-line milestone summary. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.0 KiB
7.0 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, duration, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | requirements-completed | duration | completed | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 02-permissions | 06 | ui |
|
|
|
|
|
|
|
|
|
4min | 2026-04-02 |
Phase 2 Plan 6: PermissionsViewModel and SitePickerDialog Summary
PermissionsViewModel orchestrates multi-site CSOM permission scans with TDD-verified scan loop, CSV/HTML export commands, and SitePickerDialog for multi-site selection via factory pattern
Performance
- Duration: 4 min
- Started: 2026-04-02T12:02:49Z
- Completed: 2026-04-02T12:06:55Z
- Tasks: 2
- Files modified: 6
Accomplishments
- PermissionsViewModel fully implements FeatureViewModelBase with scan loop, export, and tenant-switch reset
- SitePickerDialog XAML + code-behind: filterable ListView with checkboxes, loads via ISiteListService on Window.Loaded
- ISessionManager interface extracted so ViewModels can be unit-tested without live MSAL/SharePoint
- TDD: RED→GREEN cycle with StartScanAsync_WithMultipleSiteUrls_CallsServiceOncePerUrl passing; 60/60 tests pass
Task Commits
Each task was committed atomically:
- Task 1 RED: Failing test for PermissionsViewModel -
c462a0b(test) - Task 1 GREEN + Task 2: Full PermissionsViewModel and SitePickerDialog -
f98ca60(feat)
Files Created/Modified
SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs- Feature orchestrator: scan loop, export commands, dialog factory, tenant switchSharepointToolbox/Views/Dialogs/SitePickerDialog.xaml- Multi-site picker: filterable list with CheckBox + Title + URL columnsSharepointToolbox/Views/Dialogs/SitePickerDialog.xaml.cs- Code-behind: loads sites on Loaded, exposes SelectedUrls, filter/select-all/deselect-allSharepointToolbox/Services/ISessionManager.cs- Interface for SessionManager (new)SharepointToolbox/Services/SessionManager.cs- Now implements ISessionManagerSharepointToolbox.Tests/ViewModels/PermissionsViewModelTests.cs- Real test replacing the previous stub
Decisions Made
- ISessionManager extracted — SessionManager is a concrete class with MSAL dependencies; interface required to mock it in unit tests. Matches "extract interface for testability" pattern from Phase 1 (IPermissionsService, ISiteListService already existed).
- Test constructor — Internal constructor omits CsvExportService and HtmlExportService since export commands are not exercised in the scan loop test. Keeps tests lean.
- Dispatcher null-guard —
Application.Current?.Dispatcheris null in xUnit test context (no WPF thread). Guard ensures Results assignment succeeds in both test and production contexts.
Deviations from Plan
Auto-fixed Issues
1. [Rule 2 - Missing Critical] ISessionManager interface extracted for testability
- Found during: Task 1 (PermissionsViewModel TDD setup)
- Issue: Plan specified injecting concrete
SessionManager. Moq cannot mock concrete classes without virtual methods; unit test required a mockable abstraction. - Fix: Created
ISessionManagerinterface withGetOrCreateContextAsync,ClearSessionAsync,IsAuthenticated;SessionManagerimplements it. - Files modified: SharepointToolbox/Services/ISessionManager.cs (new), SharepointToolbox/Services/SessionManager.cs
- Verification: Build succeeds, existing 60 tests still pass
- Committed in:
c462a0b(RED phase commit)
Total deviations: 1 auto-fixed (1 missing critical)
Impact on plan: Required for correct testability. SessionManager DI registration changes to services.AddSingleton<ISessionManager, SessionManager>() — handled in Plan 07.
Issues Encountered
None — plan executed as written with one necessary interface extraction for testability.
User Setup Required
None - no external service configuration required.
Next Phase Readiness
- PermissionsViewModel and SitePickerDialog complete — all business logic for Permissions tab is done
- Plan 07 (DI wiring) must: register ISessionManager as singleton, register SitePickerDialog as Transient, set OpenSitePickerDialog factory in PermissionsView code-behind
- 60 tests passing, 3 skipped (known interactive MSAL tests)
Phase: 02-permissions Completed: 2026-04-02
Self-Check: PASSED
- FOUND: SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs
- FOUND: SharepointToolbox/Views/Dialogs/SitePickerDialog.xaml
- FOUND: SharepointToolbox/Views/Dialogs/SitePickerDialog.xaml.cs
- FOUND: SharepointToolbox/Services/ISessionManager.cs
- FOUND commits:
c462a0b(test),f98ca60(feat) - Tests: 60 passed, 3 skipped, 0 failed