---
phase: 08-simplified-permissions
plan: 05
type: execute
wave: 4
depends_on: ["08-02", "08-03", "08-04"]
files_modified:
- SharepointToolbox/Localization/Strings.resx
- SharepointToolbox/Localization/Strings.fr.resx
- SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs
autonomous: true
requirements:
- SIMP-01
- SIMP-02
- SIMP-03
must_haves:
truths:
- "All new UI strings have EN and FR localization keys"
- "Export commands pass SimplifiedResults when IsSimplifiedMode is true"
- "PermissionsView.xaml display options GroupBox uses localization keys not hardcoded strings"
artifacts:
- path: "SharepointToolbox/Localization/Strings.resx"
provides: "EN localization keys for simplified permissions UI"
contains: "grp.display.opts"
- path: "SharepointToolbox/Localization/Strings.fr.resx"
provides: "FR localization keys for simplified permissions UI"
contains: "grp.display.opts"
key_links:
- from: "SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs"
to: "SharepointToolbox/Services/Export/CsvExportService.cs"
via: "ExportCsvAsync calls simplified overload when IsSimplifiedMode"
pattern: "SimplifiedResults"
- from: "SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs"
to: "SharepointToolbox/Services/Export/HtmlExportService.cs"
via: "ExportHtmlAsync calls simplified overload when IsSimplifiedMode"
pattern: "SimplifiedResults"
---
Wire the simplified export paths, add all EN/FR localization keys, and finalize the integration between ViewModel export commands and the simplified export service overloads.
Purpose: Completes the integration: export commands use simplified data when mode is active, and all UI strings are properly localized in both languages.
Output: Updated Strings.resx, Strings.fr.resx, updated PermissionsViewModel export methods
@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/08-simplified-permissions/08-01-SUMMARY.md
@.planning/phases/08-simplified-permissions/08-02-SUMMARY.md
@.planning/phases/08-simplified-permissions/08-03-SUMMARY.md
@.planning/phases/08-simplified-permissions/08-04-SUMMARY.md
From PermissionsViewModel (current ExportCsvAsync):
```csharp
private async Task ExportCsvAsync()
{
if (_csvExportService == null || Results.Count == 0) return;
// ... SaveFileDialog ...
await _csvExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None);
}
```
From PermissionsViewModel (current ExportHtmlAsync):
```csharp
private async Task ExportHtmlAsync()
{
if (_htmlExportService == null || Results.Count == 0) return;
// ... SaveFileDialog ...
await _htmlExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None);
}
```
From CsvExportService:
```csharp
public async Task WriteAsync(IReadOnlyList entries, string filePath, CancellationToken ct);
```
From HtmlExportService:
```csharp
public async Task WriteAsync(IReadOnlyList entries, string filePath, CancellationToken ct);
```
Task 1: Add EN and FR localization keys for simplified permissions
SharepointToolbox/Localization/Strings.resx, SharepointToolbox/Localization/Strings.fr.resx
Add the following keys to `SharepointToolbox/Localization/Strings.resx` (EN). Insert them in alphabetical order among existing keys, following the existing `` element format:
```xml
Simplified mode
Display Options
Detail level:
Detailed (all rows)
Simple (summary only)
user(s)
```
Add the corresponding French translations to `SharepointToolbox/Localization/Strings.fr.resx`:
```xml
Mode simplifie
Options d'affichage
Niveau de detail :
Detaille (toutes les lignes)
Simple (resume uniquement)
utilisateur(s)
```
Note: French accented characters (e, a with accents) should be used if the resx file supports it. Check existing FR entries for the pattern — if they use plain ASCII, match that convention.
cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5
6 new localization keys added to both Strings.resx and Strings.fr.resx. Keys match the binding paths used in PermissionsView.xaml (grp.display.opts, chk.simplified.mode, lbl.detail.level, rad.detail.simple, rad.detail.detailed, lbl.summary.users).
Task 2: Wire export commands to use simplified overloads and update summary card text
SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs
Modify `SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs` to update the export commands to pass simplified data when IsSimplifiedMode is active.
Update `ExportCsvAsync`:
```csharp
private async Task ExportCsvAsync()
{
if (_csvExportService == null || Results.Count == 0) return;
var dialog = new SaveFileDialog
{
Title = "Export permissions to CSV",
Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*",
DefaultExt = "csv",
FileName = "permissions"
};
if (dialog.ShowDialog() != true) return;
try
{
if (IsSimplifiedMode && SimplifiedResults.Count > 0)
await _csvExportService.WriteAsync(SimplifiedResults.ToList(), dialog.FileName, CancellationToken.None);
else
await _csvExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None);
OpenFile(dialog.FileName);
}
catch (Exception ex)
{
StatusMessage = $"Export failed: {ex.Message}";
_logger.LogError(ex, "CSV export failed.");
}
}
```
Update `ExportHtmlAsync`:
```csharp
private async Task ExportHtmlAsync()
{
if (_htmlExportService == null || Results.Count == 0) return;
var dialog = new SaveFileDialog
{
Title = "Export permissions to HTML",
Filter = "HTML files (*.html)|*.html|All files (*.*)|*.*",
DefaultExt = "html",
FileName = "permissions"
};
if (dialog.ShowDialog() != true) return;
try
{
if (IsSimplifiedMode && SimplifiedResults.Count > 0)
await _htmlExportService.WriteAsync(SimplifiedResults.ToList(), dialog.FileName, CancellationToken.None);
else
await _htmlExportService.WriteAsync(Results, dialog.FileName, CancellationToken.None);
OpenFile(dialog.FileName);
}
catch (Exception ex)
{
StatusMessage = $"Export failed: {ex.Message}";
_logger.LogError(ex, "HTML export failed.");
}
}
```
Note: `SimplifiedResults.ToList()` converts `IReadOnlyList` to `List` which satisfies the `IReadOnlyList` parameter. This is needed because the field type is `IReadOnlyList` but the service expects `IReadOnlyList`.
Also add `using System.Linq;` if not already present (it likely is via global using or existing code).
Do NOT change constructor signatures, RunOperationAsync, or any other method besides ExportCsvAsync and ExportHtmlAsync.
cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5
ExportCsvAsync and ExportHtmlAsync check IsSimplifiedMode and pass SimplifiedResults to the overloaded WriteAsync when active. Standard PermissionEntry path unchanged when simplified mode is off.
- `dotnet build SharepointToolbox/SharepointToolbox.csproj` succeeds with 0 errors
- Strings.resx contains keys: grp.display.opts, chk.simplified.mode, lbl.detail.level, rad.detail.simple, rad.detail.detailed, lbl.summary.users
- Strings.fr.resx contains the same keys with French values
- ExportCsvAsync branches on IsSimplifiedMode to call the simplified overload
- ExportHtmlAsync branches on IsSimplifiedMode to call the simplified overload
The full pipeline is wired: UI toggles -> ViewModel mode -> simplified data -> export services. All new UI text has EN/FR localization. Exports produce simplified output when the user has simplified mode active.