docs(08-05): complete localization keys and export wiring plan

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dev
2026-04-07 14:18:37 +02:00
parent f503e6c0ca
commit a8a58f1ffc
3 changed files with 98 additions and 12 deletions

View File

@@ -75,7 +75,7 @@ Plans:
2. The report shows summary counts per permission level with color indicators distinguishing high, medium, and low access levels 2. The report shows summary counts per permission level with color indicators distinguishing high, medium, and low access levels
3. A detail-level selector (simple / detailed) controls whether individual item-level rows are shown or collapsed into summary rows 3. A detail-level selector (simple / detailed) controls whether individual item-level rows are shown or collapsed into summary rows
4. Toggling modes and detail level does not require re-running the scan — it re-renders from the already-fetched data 4. Toggling modes and detail level does not require re-running the scan — it re-renders from the already-fetched data
**Plans:** 4/6 plans executed **Plans:** 5/6 plans executed
Plans: Plans:
- [ ] 08-01-PLAN.md — RiskLevel enum, PermissionLevelMapping, SimplifiedPermissionEntry, PermissionSummary (Wave 1) - [ ] 08-01-PLAN.md — RiskLevel enum, PermissionLevelMapping, SimplifiedPermissionEntry, PermissionSummary (Wave 1)
- [ ] 08-02-PLAN.md — PermissionsViewModel simplified mode, detail toggle, summary computation (Wave 2) - [ ] 08-02-PLAN.md — PermissionsViewModel simplified mode, detail toggle, summary computation (Wave 2)
@@ -106,5 +106,5 @@ Plans:
| 5. Distribution and Hardening | v1.0 | 3/3 | Complete | 2026-04-03 | | 5. Distribution and Hardening | v1.0 | 3/3 | Complete | 2026-04-03 |
| 6. Global Site Selection | 5/5 | Complete | 2026-04-07 | - | | 6. Global Site Selection | 5/5 | Complete | 2026-04-07 | - |
| 7. User Access Audit | 10/10 | Complete | 2026-04-07 | - | | 7. User Access Audit | 10/10 | Complete | 2026-04-07 | - |
| 8. Simplified Permissions | 4/6 | In Progress| | - | | 8. Simplified Permissions | 5/6 | In Progress| | - |
| 9. Storage Visualization | v1.1 | 0/? | Not started | - | | 9. Storage Visualization | v1.1 | 0/? | Not started | - |

View File

@@ -3,14 +3,14 @@ gsd_state_version: 1.0
milestone: v1.0 milestone: v1.0
milestone_name: milestone milestone_name: milestone
status: completed status: completed
stopped_at: Completed 08-04-PLAN.md stopped_at: Completed 08-05-PLAN.md
last_updated: "2026-04-07T12:14:33.370Z" last_updated: "2026-04-07T12:18:26.872Z"
last_activity: 2026-04-07 — Completed 08-04 (Export Services Simplified Overloads) last_activity: 2026-04-07 — Completed 08-05 (Localization Keys and Export Wiring)
progress: progress:
total_phases: 4 total_phases: 4
completed_phases: 2 completed_phases: 2
total_plans: 21 total_plans: 21
completed_plans: 19 completed_plans: 20
--- ---
# Project State # Project State
@@ -25,12 +25,12 @@ See: .planning/PROJECT.md (updated 2026-04-07)
## Current Position ## Current Position
Phase: 8 — Simplified Permissions Phase: 8 — Simplified Permissions
Plan: 4 of 6 Plan: 5 of 6
Status: Plan 08-04 complete, advancing to 08-05 Status: Plan 08-05 complete, advancing to 08-06
Last activity: 2026-04-07 — Completed 08-04 (Export Services Simplified Overloads) Last activity: 2026-04-07 — Completed 08-05 (Localization Keys and Export Wiring)
``` ```
v1.1 Progress: [█████████] 90% v1.1 Progress: [█████████] 95%
Phase 6 [x] → Phase 7 [x] → Phase 8 [..] → Phase 9 [ ] Phase 6 [x] → Phase 7 [x] → Phase 8 [..] → Phase 9 [ ]
``` ```
@@ -60,6 +60,7 @@ Phase 6 [x] → Phase 7 [x] → Phase 8 [..] → Phase 9 [ ]
| Phase 08 P02 | 84 | 1 tasks | 1 files | | Phase 08 P02 | 84 | 1 tasks | 1 files |
| Phase 08 P03 | 77 | 1 tasks | 2 files | | Phase 08 P03 | 77 | 1 tasks | 2 files |
| Phase 08 P04 | 2 | 2 tasks | 2 files | | Phase 08 P04 | 2 | 2 tasks | 2 files |
| Phase 08 P05 | 2 | 2 tasks | 4 files |
## Accumulated Context ## Accumulated Context
@@ -103,6 +104,7 @@ Decisions are logged in PROJECT.md Key Decisions table.
- [Phase 07-10]: Extended CreateViewModel to 3-tuple (vm, auditMock, graphMock) so debounce test can verify SearchUsersAsync calls - [Phase 07-10]: Extended CreateViewModel to 3-tuple (vm, auditMock, graphMock) so debounce test can verify SearchUsersAsync calls
- [Phase 08]: ActiveItemsSource returns Results or SimplifiedResults based on IsSimplifiedMode -- View binds to single property - [Phase 08]: ActiveItemsSource returns Results or SimplifiedResults based on IsSimplifiedMode -- View binds to single property
- [Phase 08]: InvertBoolConverter in Core/Converters namespace for reuse; summary cards use WrapPanel; row color triggers only match SimplifiedPermissionEntry - [Phase 08]: InvertBoolConverter in Core/Converters namespace for reuse; summary cards use WrapPanel; row color triggers only match SimplifiedPermissionEntry
- [Phase 08]: FR translations use XML entities for accented chars matching existing resx convention
### Pending Todos ### Pending Todos
@@ -114,6 +116,6 @@ None.
## Session Continuity ## Session Continuity
Last session: 2026-04-07T12:14:18.409Z Last session: 2026-04-07T12:18:26.870Z
Stopped at: Completed 08-04-PLAN.md Stopped at: Completed 08-05-PLAN.md
Resume file: None Resume file: None

View File

@@ -0,0 +1,84 @@
---
phase: 08-simplified-permissions
plan: 05
subsystem: permissions-localization-export
tags: [localization, export, simplified-permissions, i18n]
dependency_graph:
requires: [08-02, 08-03, 08-04]
provides: [localized-simplified-ui, simplified-export-wiring]
affects: [PermissionsView.xaml, PermissionsViewModel.cs, Strings.resx, Strings.fr.resx]
tech_stack:
added: []
patterns: [resx-localization, export-branching, xaml-run-binding]
key_files:
created: []
modified:
- SharepointToolbox/Localization/Strings.resx
- SharepointToolbox/Localization/Strings.fr.resx
- SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs
- SharepointToolbox/Views/Tabs/PermissionsView.xaml
decisions:
- "FR translations use XML entities for accented chars matching existing convention"
- "Hardcoded user(s) in XAML summary cards wired to lbl.summary.users localization key"
metrics:
duration_minutes: 2
completed: "2026-04-07"
tasks_completed: 2
tasks_total: 2
---
# Phase 08 Plan 05: Localization Keys and Export Wiring Summary
EN/FR localization keys for simplified permissions UI plus export command branching on IsSimplifiedMode to call simplified WriteAsync overloads.
## What Was Done
### Task 1: Add EN and FR localization keys for simplified permissions
Added 6 localization keys to both `Strings.resx` (EN) and `Strings.fr.resx` (FR):
| Key | EN Value | FR Value |
|-----|----------|----------|
| `chk.simplified.mode` | Simplified mode | Mode simplifie |
| `grp.display.opts` | Display Options | Options d'affichage |
| `lbl.detail.level` | Detail level: | Niveau de detail : |
| `rad.detail.detailed` | Detailed (all rows) | Detaille (toutes les lignes) |
| `rad.detail.simple` | Simple (summary only) | Simple (resume uniquement) |
| `lbl.summary.users` | user(s) | utilisateur(s) |
Keys inserted in alphabetical order among existing entries. FR translations use XML entities for accented characters (matching existing convention in the file).
Also wired the hardcoded `" user(s)"` text in `PermissionsView.xaml` summary cards to use the `lbl.summary.users` localization key via a `Run` binding to `TranslationSource.Instance`.
**Commit:** `60ddcd7`
### Task 2: Wire export commands to use simplified overloads
Updated `ExportCsvAsync` and `ExportHtmlAsync` in `PermissionsViewModel.cs` to branch on `IsSimplifiedMode`:
- When `IsSimplifiedMode` is true and `SimplifiedResults.Count > 0`, calls `WriteAsync(SimplifiedResults.ToList(), ...)` (simplified overload)
- Otherwise, calls the existing `WriteAsync(Results, ...)` (standard overload)
No changes to constructor signatures, `RunOperationAsync`, or any other methods.
**Commit:** `f503e6c`
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 2 - Missing Localization] Wired hardcoded "user(s)" in XAML summary cards**
- **Found during:** Task 1
- **Issue:** PermissionsView.xaml had hardcoded `<Run Text=" user(s)" />` in summary card template
- **Fix:** Replaced with `<Run Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[lbl.summary.users], Mode=OneWay}" />`
- **Files modified:** SharepointToolbox/Views/Tabs/PermissionsView.xaml
- **Commit:** 60ddcd7
## Verification
- `dotnet build` succeeds with 0 errors, 0 warnings
- 6 keys present in both Strings.resx and Strings.fr.resx
- 2 export methods branch on IsSimplifiedMode
- XAML summary card uses localized lbl.summary.users key
## Self-Check: PASSED