100 Commits
Author SHA1 Message Date
Dev 8c66fe6518 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-05-28 17:51:45 +02:00
Dev 5d305ccc4c Added max list size circumvention for file transfers between sites. 2026-05-28 17:50:23 +02:00
Dev e9065f2410 Added max list size circumvention for file transfers between sites. 2026-05-13 15:58:16 +02:00
Dev 4b51c8e3c3 Fixed Kiota CVE : pinned 1.17.1 → 1.22.2 2026-05-12 15:25:43 +02:00
Dev 1312dcdb1e Added new feature : display the file/folder and link of a SharingLink object in the permissions reports. 2026-05-12 15:20:51 +02:00
Dev ecc7b329d4 Fix storage metrics not being accurate 2026-05-06 09:17:40 +02:00
Dev f56e8813e5 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-05-05 09:33:10 +02:00
Dev 461c7d5bb4 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-05-05 09:32:58 +02:00
Dev 4dc4022405 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-05-04 12:31:24 +02:00
Dev 3f24fdd01e Merge remote-tracking branch 'kawa/main' 2026-05-04 12:31:13 +02:00
Dev 55e5cfc506 Merge remote-tracking branch 'kawa/main' 2026-04-29 17:55:56 +02:00
Dev 23a638a10a Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-29 17:27:51 +02:00
Dev a48df65f2e Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-29 10:44:47 +02:00
Dev df179be2ed Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-29 10:44:30 +02:00
Dev efb3d2ad11 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-24 10:54:47 +02:00
Dev 2c9dbe39d3 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-24 10:54:41 +02:00
Dev b8c09655ac Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-24 10:50:19 +02:00
DevandClaude Opus 4.7 12dd1de9f2 chore: release v2.4
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager)
- Add InputDialog, Spinner common view
- Add DuplicatesCsvExportService
- Refresh views, dialogs, and view models across tabs
- Update localization strings (en/fr)
- Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 10:50:03 +02:00
DevandClaude Opus 4.7 f4cc81bb71 chore: release v2.4
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager)
- Add InputDialog, Spinner common view
- Add DuplicatesCsvExportService
- Refresh views, dialogs, and view models across tabs
- Update localization strings (en/fr)
- Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:23:11 +02:00
Dev 8f30a60d2a Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-15 14:27:36 +02:00
Dev b33c0769d4 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-15 11:16:24 +02:00
DevandClaude Opus 4.6 fec5ae26e1 chore: clean repo for v2.0 publish
- Remove .planning/ (251 GSD planning files)
- Remove old PowerShell-era files (TODO.md, lang/, examples/)
- Remove accidentally tracked zip
- Rewrite README for .NET WPF app
- Update .gitignore

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:16:09 +02:00
DevandClaude Opus 4.6 d885431c90 chore: clean repo for v2.0 publish
- Remove .planning/ (251 GSD planning files)
- Remove old PowerShell-era files (TODO.md, lang/, examples/)
- Remove accidentally tracked zip
- Rewrite README for .NET WPF app
- Update .gitignore

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 17:08:49 +02:00
Dev d656788a9b Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-09 17:05:32 +02:00
Dev cab8588569 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox
Modified Gitignore
2026-04-09 17:05:07 +02:00
Dev 53ae3681bf Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-09 17:03:56 +02:00
Dev 06a3b5d512 Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox
Cleaned the repo
2026-04-09 17:03:45 +02:00
Dev 5ed2f801af Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-09 16:48:32 +02:00
Dev d8d25b967d Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-09 16:48:28 +02:00
Dev 7af9bf2d5e Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox 2026-04-09 16:46:44 +02:00
DevandClaude Opus 4.6 baa3c7562d chore: prepare for v2.0 release
- Remove bin/obj/publish from git tracking
- Update .gitignore for .NET project (source only)
- Add release.ps1 local publish script (replaces Gitea workflow)
- Remove .gitea/workflows/release.yml
- Fix duplicate group names to show library names
- Fix HTML export to show Name column in duplicates report
- Fix consolidated permissions HTML to show folder/library names

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:46:37 +02:00
DevandClaude Opus 4.6 f41172c398 chore: prepare for v2.0 release
- Remove bin/obj/publish from git tracking
- Update .gitignore for .NET project (source only)
- Add release.ps1 local publish script (replaces Gitea workflow)
- Remove .gitea/workflows/release.yml
- Fix duplicate group names to show library names
- Fix HTML export to show Name column in duplicates report
- Fix consolidated permissions HTML to show folder/library names

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:42:12 +02:00
DevandClaude Opus 4.6 10e5ae9125 docs(phase-19): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 15:23:58 +02:00
Dev 5d0b5cf85e docs(19-02): complete register/remove app UI plan
- 19-02-SUMMARY.md created
- STATE.md: progress 100%, decisions, session updated
- ROADMAP.md: phase 19 marked complete
- REQUIREMENTS.md: APPREG-01, APPREG-04, APPREG-05 marked complete
2026-04-09 15:20:55 +02:00
Dev 809ac8613b feat(19-02): add app registration UI to profile dialog and 7 ViewModel tests
- ProfileManagementDialog.xaml: height 750, new Row 4 with Register/Remove buttons
- BooleanToVisibilityConverter added to Window.Resources
- Fallback instructions panel bound to ShowFallbackInstructions
- RegistrationStatus text block with StringToVisibilityConverter
- Buttons row shifted to Row 5
- ProfileManagementViewModelRegistrationTests: 7 unit tests, all passing
- ProfileManagementViewModelLogoTests: updated to 5-param constructor
2026-04-09 15:19:37 +02:00
Dev 42b5eda460 feat(19-02): add RegisterApp/RemoveApp commands, DI wiring, EN/FR localization
- ProfileManagementViewModel: IAppRegistrationService injected, RegisterAppCommand/RemoveAppCommand added
- IsRegistering, ShowFallbackInstructions, RegistrationStatus observable properties
- HasRegisteredApp computed property, CanRegisterApp/CanRemoveApp guards
- RegisterAppAsync: admin check, fallback panel, AppId persistence
- RemoveAppAsync: removal + MSAL clear + AppId null + persistence
- App.xaml.cs: IAppRegistrationService singleton registered
- Strings.resx/fr.resx: 16 new localization keys for register/remove/fallback flow
2026-04-09 15:17:53 +02:00
Dev 69c9d77be3 docs(19-01): complete AppRegistrationService plan execution
- 19-01-SUMMARY.md: service layer implementation with rollback pattern
- STATE.md: progress 98%, decisions added, session updated
- ROADMAP.md: phase 19 in-progress (1/2 plans)
- REQUIREMENTS.md: APPREG-02, APPREG-03, APPREG-06 marked complete
2026-04-09 15:15:16 +02:00
Dev 8083cdf7f5 test(19-01): add unit tests for AppRegistrationService and models
- AppRegistrationResult factory methods (Success/Failure/FallbackRequired)
- TenantProfile.AppId null default and JSON round-trip
- AppRegistrationService implements IAppRegistrationService
- BuildRequiredResourceAccess structure (2 resources, 4+1 scopes, all Scope type)
2026-04-09 15:14:02 +02:00
Dev 93dbb8c5b0 feat(19-01): add AppRegistrationService with rollback, model, and interface
- AppRegistrationResult discriminated result (Success/Failure/FallbackRequired)
- TenantProfile.AppId nullable string for storing registered app ID
- IAppRegistrationService interface (IsGlobalAdminAsync, RegisterAsync, RemoveAsync, ClearMsalSessionAsync)
- AppRegistrationService: sequential registration with rollback, transitiveMemberOf admin check, MSAL eviction
2026-04-09 15:12:51 +02:00
DevandClaude Opus 4.6 7d200ecf3f docs(19): create phase plan for app registration and removal
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 14:48:49 +02:00
DevandClaude Opus 4.6 0d087ae4cd docs(phase-19): add research and validation strategy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 14:44:07 +02:00
DevandClaude Sonnet 4.6 bb3ba7b177 docs(phase-19): research app registration & removal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 14:43:00 +02:00
DevandClaude Opus 4.6 9549314f22 docs(phase-18): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 14:37:18 +02:00
Dev 04a5b267b7 docs(18-02): complete scan-loop elevation plan
- 18-02-SUMMARY.md: elevation logic, DataGrid visual, 8 new tests
- STATE.md: position advanced, decisions recorded, session updated
- ROADMAP.md: phase 18 marked complete (2/2 summaries)
- REQUIREMENTS.md: OWN-02 marked complete
2026-04-09 14:34:34 +02:00
Dev 2302cad531 feat(18-02): DataGrid visual differentiation + localization for elevated rows
- Add WasAutoElevated DataTrigger to DataGrid.RowStyle: amber background + tooltip
- Add warning icon (U+26A0) indicator column (width 24) before Object Type column
- Icon shown via DataTrigger on WasAutoElevated, hidden by default
- Add permissions.elevated.tooltip EN key to Strings.resx
- Add permissions.elevated.tooltip FR key to Strings.fr.resx
2026-04-09 14:33:00 +02:00
Dev 6270fe4605 feat(18-02): scan-loop elevation logic + PermissionsViewModel wiring + tests
- Add _settingsService and _ownershipService fields to PermissionsViewModel
- Add SettingsService? and IOwnershipElevationService? to both constructors
- Add DeriveAdminUrl internal static helper for admin URL derivation
- Add IsAccessDenied helper catching ServerUnauthorizedAccessException + WebException 403
- Add IsAutoTakeOwnershipEnabled async helper reading toggle from SettingsService
- Refactor RunOperationAsync with try/catch elevation pattern (read toggle before loop)
- Tag elevated entries with WasAutoElevated=true via record with expression
- Add PermissionsViewModelOwnershipTests (8 tests): toggle OFF propagates, toggle ON elevates+retries, no elevation on success, WasAutoElevated tagging, elevation throw propagates, DeriveAdminUrl theory
2026-04-09 14:31:58 +02:00
Dev 11e835f586 docs(18-01): complete auto-take-ownership settings foundation plan
- 18-01-SUMMARY.md: plan execution summary
- STATE.md: progress updated to 98%, decisions recorded, stopped-at updated
- ROADMAP.md: phase 18 marked in-progress (1/2 summaries)
- REQUIREMENTS.md: OWN-01 marked complete
2026-04-09 14:25:47 +02:00
Dev 20948e4bac feat(18-01): SettingsView ownership checkbox + EN/FR localization keys
- SettingsView.xaml: Auto-Take Ownership section with CheckBox bound to AutoTakeOwnership
- Strings.resx: settings.ownership.title/auto/description keys (EN)
- Strings.fr.resx: matching French translations
2026-04-09 14:24:31 +02:00
Dev 36fb312b5a feat(18-01): models, SettingsService, OwnershipElevationService + tests
- AppSettings.AutoTakeOwnership bool property defaulting to false
- PermissionEntry.WasAutoElevated optional param (default false, last position)
- SettingsService.SetAutoTakeOwnershipAsync persists toggle
- IOwnershipElevationService interface + OwnershipElevationService wrapping Tenant.SetSiteAdmin
- SettingsViewModel.AutoTakeOwnership property loads and persists via SetAutoTakeOwnershipAsync
- DI registration in App.xaml.cs (Phase 18 section)
- 8 new tests: models, persistence, service, viewmodel
2026-04-09 14:23:08 +02:00
DevandClaude Opus 4.6 3479fff4c3 docs(18): complete phase research, validation, and plans
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 14:17:00 +02:00
DevandClaude Opus 4.6 dbb59d119b docs(18): create phase plan for auto-take-ownership
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 14:15:15 +02:00
DevandClaude Opus 4.6 997086cf07 docs(phase-17): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 13:13:46 +02:00
Dev 23ed46e614 docs(17-02): complete group expansion HTML reports plan
- 17-02-SUMMARY.md created
- STATE.md updated: session, decisions, progress
- ROADMAP.md: phase 17 marked complete (2/2 plans)
- REQUIREMENTS.md: RPT-01 marked complete
2026-04-09 13:11:21 +02:00
Dev aab3aee3df feat(17-02): wire ISharePointGroupResolver into PermissionsViewModel export flow
- Add _groupResolver field (ISharePointGroupResolver?) with constructor injection
- ISharePointGroupResolver added as optional last parameter in main constructor
- ExportHtmlAsync resolves SharePoint group names before calling WriteAsync
- Gracefully handles resolution failure with LogWarning, exports without expansion
- Both WriteAsync call sites pass groupMembers dict (standard and simplified paths)
2026-04-09 13:10:31 +02:00
Dev 07ed6e2515 feat(17-02): extend HtmlExportService with expandable group pills and toggleGroup JS
- Add optional groupMembers parameter to both BuildHtml overloads and WriteAsync methods
- SharePoint group pills render as expandable with onclick toggleGroup when groupMembers provided
- Hidden member sub-rows injected after parent row with resolved member names
- Empty member list renders 'members unavailable' fallback label
- toggleGroup JS function added to inline script block in both overloads
- filterTable updated to skip data-group sub-rows
- CSS for .group-expandable added to both overloads
- Backward compatibility: null groupMembers produces identical output to pre-Phase 17
2026-04-09 13:09:38 +02:00
Dev c35ee76987 test(17-02): add failing tests for group pill expansion and backward compatibility
- BuildHtml_NoGroupMembers_IdenticalToDefault
- BuildHtml_WithGroupMembers_RendersExpandablePill
- BuildHtml_WithGroupMembers_RendersHiddenMemberSubRow
- BuildHtml_WithEmptyMemberList_RendersMembersUnavailable
- BuildHtml_ContainsToggleGroupJs
- BuildHtml_Simplified_WithGroupMembers_RendersExpandablePill
2026-04-09 13:07:46 +02:00
Dev 7bebbbcc02 docs(17-01): complete SharePointGroupResolver service plan - SUMMARY, STATE, ROADMAP updated 2026-04-09 13:06:16 +02:00
Dev 1aa0d15e9a feat(17-01): register ISharePointGroupResolver in DI container (App.xaml.cs) 2026-04-09 13:05:09 +02:00
Dev 543b863283 feat(17-01): ResolvedMember model, ISharePointGroupResolver interface, SharePointGroupResolver CSOM+Graph implementation
- ResolvedMember record in Core/Models with DisplayName and Login
- ISharePointGroupResolver interface with ResolveGroupsAsync contract
- SharePointGroupResolver: CSOM group user loading + Graph transitive AAD resolution
- Internal static helpers IsAadGroup, ExtractAadGroupId, StripClaims (all green unit tests)
- Graceful error handling: exceptions return empty list per group, never throw
- OrdinalIgnoreCase result dict; lazy Graph client creation on first AAD group
2026-04-09 13:04:56 +02:00
Dev 0f8b1953e1 test(17-01): add failing tests for SharePointGroupResolver static helpers and empty-list contract 2026-04-09 13:03:27 +02:00
DevandClaude Opus 4.6 a374a4e1d3 docs(17): create phase plan for group expansion in HTML reports
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:59:12 +02:00
Dev 57bfe3e5c1 docs(phase-17): add research and validation strategy 2026-04-09 12:53:15 +02:00
Dev a2c213b72d docs(phase-17): research group expansion in HTML reports 2026-04-09 12:51:50 +02:00
DevandClaude Opus 4.6 ddb1a28a9f docs(phase-16): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:43:12 +02:00
Dev 1ff99f0bb7 docs(16-02): complete consolidated HTML export plan
- SUMMARY.md: BuildConsolidatedHtml with expandable location sub-lists, by-site view suppression, ViewModel wiring
- STATE.md: updated position, decisions, session
- ROADMAP.md: phase 16 marked Complete (2/2 plans with summaries)
2026-04-09 12:40:00 +02:00
Dev 0ebe707aca feat(16-02): implement consolidated HTML rendering path
- Add mergePermissions parameter to BuildHtml and WriteAsync
- Early-return branch calls PermissionConsolidator.Consolidate and delegates to BuildConsolidatedHtml
- BuildConsolidatedHtml: by-user table with Sites column, expandable [N sites] badge with toggleGroup, hidden sub-rows (data-group=locN), inline title for single-location entries
- By-site view and btn-site omitted when mergePermissions=true
- Wire UserAccessAuditViewModel.ExportHtmlAsync to pass MergePermissions
- Fix existing branding test call site to use named parameter
2026-04-09 12:38:19 +02:00
Dev 3d95d2aa8d test(16-02): add failing tests for RPT-03-b through RPT-03-e
- RPT-03-b: mergePermissions=false output identical to default
- RPT-03-c: mergePermissions=true contains Sites column header
- RPT-03-d: 2+ locations produce badge + hidden sub-rows with toggleGroup
- RPT-03-e: mergePermissions=true omits btn-site and view-site
2026-04-09 12:36:35 +02:00
Dev 8979becad2 docs(16-01): complete MergePermissions toggle and consolidated CSV export plan
- 16-01-SUMMARY.md created with all task outcomes and verification results
- STATE.md updated with decisions, session info, progress bar (98%)
- ROADMAP.md updated: phase 16 in-progress (1/2 summaries complete)
- REQUIREMENTS.md: RPT-03 marked complete
2026-04-09 12:35:07 +02:00
Dev 28714fbebc feat(16-01): implement consolidated CSV export path and wire ViewModel call site
- Added mergePermissions=false optional parameter to WriteSingleFileAsync
- Added early-return consolidated branch using PermissionConsolidator.Consolidate
- Consolidated CSV uses distinct header with Locations and LocationCount columns
- Locations column is semicolon-separated site titles for multi-location rows
- Existing non-consolidated code path is completely unchanged
- UserAccessAuditViewModel.ExportCsvAsync now passes MergePermissions to service
2026-04-09 12:33:54 +02:00
Dev 4f7a6e3faa test(16-01): add failing tests for RPT-03-f and RPT-03-g (consolidated CSV export)
- RPT-03-f: mergePermissions=false produces byte-identical output to default call
- RPT-03-g: mergePermissions=true writes consolidated header and merged rows
- Edge case: single-location entry has LocationCount=1 with no semicolons in Locations
2026-04-09 12:32:42 +02:00
Dev db42047db1 feat(16-01): add Export Options GroupBox with MergePermissions checkbox to both XAML views
- Added Export Options GroupBox after Scan Options in UserAccessAuditView.xaml
- Added Export Options GroupBox after Display Options in PermissionsView.xaml
- Both checkboxes bind to MergePermissions with localized labels via TranslationSource
2026-04-09 12:32:08 +02:00
Dev ed9f149b82 feat(16-01): add MergePermissions property to both ViewModels and localization keys
- Added [ObservableProperty] _mergePermissions (defaults false) to UserAccessAuditViewModel
- Added [ObservableProperty] _mergePermissions (no-op placeholder) to PermissionsViewModel
- Added audit.grp.export and chk.merge.permissions keys to Strings.resx (EN)
- Added audit.grp.export and chk.merge.permissions keys to Strings.fr.resx (FR)
2026-04-09 12:31:46 +02:00
DevandClaude Opus 4.6 720a419788 docs(16-report-consolidation-toggle): create phase plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:19:06 +02:00
DevandClaude Opus 4.6 68b123ff6c docs(16): add research and validation strategy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:13:30 +02:00
DevandClaude Sonnet 4.6 0336f4341f docs(phase-16): research report consolidation toggle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 12:12:13 +02:00
DevandClaude Opus 4.6 8f11699527 docs(16): gather phase context via discuss-phase
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:07:43 +02:00
DevandClaude Opus 4.6 9c588a4389 docs(phase-15): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:49:34 +02:00
Dev fd67ee8b76 docs(15-02): complete PermissionConsolidator unit tests plan
- 9 tests pass covering RPT-04-a through RPT-04-i
- Full solution builds with 0 errors, 321 tests pass
- STATE.md updated, ROADMAP.md phase 15 marked Complete
2026-04-09 11:46:43 +02:00
Dev 7b9f3e17aa test(15-02): add PermissionConsolidatorTests with 9 test cases (RPT-04-a through RPT-04-i)
- RPT-04-a: empty input returns empty list
- RPT-04-b: single entry -> 1 row with 1 location
- RPT-04-c: 3 entries same key -> 1 row with 3 locations
- RPT-04-d: different PermissionLevel -> separate rows
- RPT-04-e: case-insensitive key merges ALICE@ and alice@
- RPT-04-f: MakeKey produces pipe-delimited lowercase format
- RPT-04-g: 11-row input with 3 merge groups -> 7 consolidated rows
- RPT-04-h: LocationCount equals Locations.Count
- RPT-04-i: IsHighPrivilege/IsExternalUser preserved from first entry
2026-04-09 11:45:22 +02:00
DevandClaude Sonnet 4.6 9bfdfb77dd docs(15-01): complete consolidation data model plan
- Add 15-01-SUMMARY.md with task commits, decisions, and next phase readiness
- Update STATE.md with decisions and session position
- Update ROADMAP.md phase 15 progress (1/2 plans complete)
- Mark requirement RPT-04 complete in REQUIREMENTS.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 11:42:47 +02:00
Dev 440b2474e9 feat(15-01): add PermissionConsolidator static helper
- MakeKey builds pipe-delimited case-insensitive key from UserLogin+PermissionLevel+AccessType+GrantedThrough
- Consolidate groups UserAccessEntry list by key, merges into ConsolidatedPermissionEntry rows
- Empty input short-circuits to Array.Empty
- Output ordered by UserLogin then PermissionLevel for deterministic results
2026-04-09 11:41:26 +02:00
Dev 270329bd82 feat(15-01): add LocationInfo and ConsolidatedPermissionEntry model records
- LocationInfo record holds five location fields (SiteUrl, SiteTitle, ObjectTitle, ObjectUrl, ObjectType)
- ConsolidatedPermissionEntry record holds key fields plus IReadOnlyList<LocationInfo> Locations
- LocationCount computed property returns Locations.Count
2026-04-09 11:41:05 +02:00
DevandClaude Opus 4.6 f5b3f08f88 docs(15): create consolidation data model phase plans
Two plans for Phase 15: models + consolidator service (wave 1), unit tests + build verification (wave 2).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:36:42 +02:00
DevandClaude Opus 4.6 9031fd3473 docs(15): research phase domain for consolidation data model
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:32:23 +02:00
DevandClaude Opus 4.6 e3ff27a673 docs: create milestone v2.3 roadmap (5 phases, 15-19)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:31:54 +02:00
DevandClaude Opus 4.6 d967a8bb65 docs: define milestone v2.3 requirements (12 requirements)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:11:25 +02:00
DevandClaude Opus 4.6 4ad5f078c9 docs: synthesize v2.3 research summary
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:00:02 +02:00
DevandClaude Sonnet 4.6 853f47c4a6 docs: complete v2.3 project research (STACK, FEATURES, ARCHITECTURE, PITFALLS)
Research covers all five v2.3 features: automated app registration, app removal,
auto-take ownership, group expansion in HTML reports, and report consolidation toggle.
No new NuGet packages required. Build order and phase implications documented.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 10:58:58 +02:00
DevandClaude Opus 4.6 9318bb494d docs: start milestone v2.3 Tenant Management & Report Enhancements
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:43:56 +02:00
DevandClaude Opus 4.6 f41dbd333e chore: archive v2.2 Report Branding & User Directory milestone
Release SharePoint Toolbox v2 / release (push) Failing after 14s
5 phases (10-14), 14 plans, 11/11 requirements complete.
Key features: HTML report branding with MSP/client logos, user directory
browse mode with paginated load and member/guest filtering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:27:33 +02:00
DevandClaude Opus 4.6 b9511bd2b0 docs(14): mark phase 14 plan checkboxes complete in roadmap
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:31:52 +02:00
DevandClaude Opus 4.6 febb67ab64 docs(14-02): complete directory browse UI plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:31:08 +02:00
DevandClaude Opus 4.6 1a1e83cfad feat(14-02): add directory browse mode UI with mode toggle, DataGrid, and loading UX
- Mode toggle (Search/Browse) RadioButtons at top of left panel
- Search panel uses DataTrigger inverse visibility (collapses when IsBrowseMode=true)
- Browse panel with Load/Cancel buttons, IncludeGuests checkbox, filter TextBox, status/count
- Directory DataGrid with 5 columns (Name, Email, Department, Job Title, Type)
- Guest users highlighted in orange via DataTrigger on UserType
- SelectedUsers extracted to shared section visible in both modes
- DataGrid wired to DirectoryDataGrid_MouseDoubleClick handler
- Scan Options and Run/Export buttons remain always visible

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:29:59 +02:00
DevandClaude Opus 4.6 f11bfefe52 docs(14-01): complete directory UI infrastructure plan
- SUMMARY.md with 3 tasks, 4 commits, 5 files modified
- STATE.md updated with position and decisions
- ROADMAP.md updated with phase 14 progress (1/2 plans)
- REQUIREMENTS.md: UDIR-05 marked complete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:27:44 +02:00
DevandClaude Opus 4.6 d1282cea5d feat(14-01): add DirectoryDataGrid_MouseDoubleClick code-behind handler
- Extracts GraphDirectoryUser from DataGrid.SelectedItem on double-click
- Invokes SelectDirectoryUserCommand to add user to audit pipeline
- Using added for SharepointToolbox.Core.Models

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:26:41 +02:00
DevandClaude Opus 4.6 e6ba2d8146 feat(14-01): add SelectDirectoryUserCommand bridging directory to audit pipeline
- RelayCommand<GraphDirectoryUser> converts to GraphUserResult and adds to SelectedUsers
- Duplicate UPN check prevents adding same user twice
- Initialized in both DI and test constructors
- 4 new tests pass (add, skip duplicate, null, auditable)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:26:12 +02:00
DevandClaude Opus 4.6 381081da18 test(14-01): add failing tests for SelectDirectoryUserCommand
- Test 17: adds user to SelectedUsers
- Test 18: skips duplicates
- Test 19: null does nothing
- Test 20: user is auditable after selection

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:25:18 +02:00
DevandClaude Opus 4.6 70e8d121fd feat(14-01): add 14 localization keys for directory browse UI (EN + FR)
- audit.mode.search, audit.mode.browse for mode toggle labels
- directory.grp.browse, directory.btn.load, directory.btn.cancel
- directory.filter.placeholder, directory.chk.guests, directory.status.count
- directory.hint.doubleclick, directory.col.name/upn/department/jobtitle/type

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:24:54 +02:00
DevandClaude Opus 4.6 df6f4949a8 docs(13-02): complete User Directory ViewModel plan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:44:56 +02:00
DevandClaude Opus 4.6 4ba4de6106 feat(13-02): add directory browse mode with paginated load, member/guest filter, and sortable ICollectionView
- Inject IGraphUserDirectoryService into UserAccessAuditViewModel (both constructors)
- Add IsBrowseMode toggle, DirectoryUsers collection, DirectoryUsersView with sort/filter
- Add LoadDirectoryCommand with progress reporting, cancellation, and error handling
- Add IncludeGuests toggle for in-memory member/guest filtering (no new Graph request)
- Add DirectoryFilterText for DisplayName/UPN/Department/JobTitle text search
- Add DirectoryUserCount computed property reflecting filtered view count
- Update OnTenantSwitched to clear all directory state
- Add 16 comprehensive unit tests covering all directory browse behaviors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:07:53 +02:00