--- phase: 07-user-access-audit plan: 07 type: execute wave: 4 depends_on: ["07-04", "07-05", "07-06"] files_modified: - SharepointToolbox/MainWindow.xaml - SharepointToolbox/MainWindow.xaml.cs - SharepointToolbox/App.xaml.cs - SharepointToolbox/Localization/Strings.resx - SharepointToolbox/Localization/Strings.fr.resx autonomous: true requirements: - UACC-01 must_haves: truths: - "User Access Audit tab appears in MainWindow TabControl" - "Tab content is wired to DI-resolved UserAccessAuditView" - "All new services (IUserAccessAuditService, IGraphUserSearchService, export services) are registered in DI" - "UserAccessAuditViewModel and UserAccessAuditView are registered in DI" - "All localization keys used in UserAccessAuditView.xaml exist in both Strings.resx and Strings.fr.resx" - "Site picker dialog factory is wired from MainWindow.xaml.cs" artifacts: - path: "SharepointToolbox/MainWindow.xaml" provides: "New TabItem for User Access Audit" contains: "UserAccessAuditTabItem" - path: "SharepointToolbox/MainWindow.xaml.cs" provides: "DI wiring for audit tab content and dialog factory" contains: "UserAccessAuditView" - path: "SharepointToolbox/App.xaml.cs" provides: "DI registrations for all Phase 7 services and ViewModels" contains: "UserAccessAuditService" - path: "SharepointToolbox/Localization/Strings.resx" provides: "English localization keys for audit tab" contains: "tab.userAccessAudit" - path: "SharepointToolbox/Localization/Strings.fr.resx" provides: "French localization keys for audit tab" contains: "tab.userAccessAudit" key_links: - from: "SharepointToolbox/MainWindow.xaml" to: "SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml" via: "TabItem.Content set from code-behind" pattern: "UserAccessAuditTabItem" - from: "SharepointToolbox/App.xaml.cs" to: "SharepointToolbox/Services/UserAccessAuditService.cs" via: "DI registration AddTransient" pattern: "UserAccessAuditService" --- Wire the User Access Audit tab into the application: add TabItem to MainWindow, register all Phase 7 services in DI, set up dialog factories, and add all localization keys in English and French. Purpose: Integration glue that makes all Phase 7 pieces discoverable and functional at runtime. Output: Modified MainWindow.xaml, MainWindow.xaml.cs, App.xaml.cs, Strings.resx, Strings.fr.resx @C:/Users/dev/.claude/get-shit-done/workflows/execute-plan.md @C:/Users/dev/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/07-user-access-audit/07-CONTEXT.md @.planning/phases/07-user-access-audit/07-04-SUMMARY.md @.planning/phases/07-user-access-audit/07-05-SUMMARY.md @.planning/phases/07-user-access-audit/07-06-SUMMARY.md From SharepointToolbox/MainWindow.xaml (existing tabs): ```xml ``` From SharepointToolbox/MainWindow.xaml.cs: ```csharp PermissionsTabItem.Content = serviceProvider.GetRequiredService(); StorageTabItem.Content = serviceProvider.GetRequiredService(); // ... etc SettingsTabItem.Content = serviceProvider.GetRequiredService(); ``` From SharepointToolbox/App.xaml.cs: ```csharp // Phase 2: Permissions services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); ``` Services: IUserAccessAuditService -> UserAccessAuditService, IGraphUserSearchService -> GraphUserSearchService Export: UserAccessCsvExportService, UserAccessHtmlExportService ViewModel: UserAccessAuditViewModel View: UserAccessAuditView Task 1: Add DI registrations in App.xaml.cs SharepointToolbox/App.xaml.cs In `App.xaml.cs`, add a new section in `RegisterServices` after the existing Phase 4 registrations and before `services.AddSingleton()`: ```csharp // Phase 7: User Access Audit services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); ``` Add the necessary using statement at the top if not already present (Services.Export namespace is already imported via existing export services). cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5 App.xaml.cs registers all Phase 7 services, ViewModel, and View in the DI container. Task 2: Add TabItem to MainWindow.xaml and wire in MainWindow.xaml.cs SharepointToolbox/MainWindow.xaml, SharepointToolbox/MainWindow.xaml.cs **MainWindow.xaml**: Add a new TabItem before SettingsTabItem (after TemplatesTabItem): ```xml ``` **MainWindow.xaml.cs**: Add tab content wiring after the existing tab assignments, before SettingsTabItem: ```csharp // Phase 7: User Access Audit var auditView = serviceProvider.GetRequiredService(); UserAccessAuditTabItem.Content = auditView; // Wire site picker dialog factory for audit tab (same pattern as Permissions) if (auditView.DataContext is UserAccessAuditViewModel auditVm) { auditVm.OpenSitePickerDialog = () => { var factory = serviceProvider.GetRequiredService>(); return factory(auditVm.CurrentProfile ?? new TenantProfile()); }; } ``` Add `using SharepointToolbox.ViewModels.Tabs;` to MainWindow.xaml.cs if not already present (it should be via existing tab wiring, but the UserAccessAuditViewModel type needs to be resolved). cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5 MainWindow.xaml has UserAccessAuditTabItem. MainWindow.xaml.cs wires UserAccessAuditView content and site picker dialog factory. Task 3: Add localization keys to Strings.resx and Strings.fr.resx SharepointToolbox/Localization/Strings.resx, SharepointToolbox/Localization/Strings.fr.resx Add the following keys to both resx files. Add them at the end of the existing data entries, before the closing `` tag. **Strings.resx (English):** ```xml User Access Audit Select Users Target Sites Scan Options Search users by name or email... {0} user(s) selected Run Audit Export CSV Export HTML Total Accesses Sites High Privilege By User By Site Filter results... Select at least one user to audit. Select at least one site to scan. ``` **Strings.fr.resx (French):** ```xml Audit des acces utilisateur Selectionner les utilisateurs Sites cibles Options d'analyse Rechercher par nom ou email... {0} utilisateur(s) selectionne(s) Lancer l'audit Exporter CSV Exporter HTML Total des acces Sites Privileges eleves Par utilisateur Par site Filtrer les resultats... Selectionnez au moins un utilisateur. Selectionnez au moins un site. ``` Note: French accented characters (e with accent) should use proper Unicode characters in the actual file. Use the existing file's encoding pattern. cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5 Both Strings.resx and Strings.fr.resx contain all audit-related localization keys. Keys match those referenced in UserAccessAuditView.xaml. - `dotnet build SharepointToolbox/SharepointToolbox.csproj` succeeds with 0 errors - MainWindow shows User Access Audit tab in the TabControl - App.xaml.cs has DI registrations for all Phase 7 types - All localization keys used in XAML exist in both resx files - Site picker dialog factory is wired for the audit ViewModel The User Access Audit feature is fully integrated into the application. The tab appears in MainWindow, all services resolve from DI, dialog factories work, and UI text is localized in both English and French. After completion, create `.planning/phases/07-user-access-audit/07-07-SUMMARY.md`