chore: complete v1.0 milestone
All checks were successful
Release zip package / release (push) Successful in 10s

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>
This commit is contained in:
Dev
2026-04-07 09:15:14 +02:00
parent b815c323d7
commit 655bb79a99
95 changed files with 610 additions and 332 deletions

View File

@@ -0,0 +1,171 @@
---
phase: 02-permissions
plan: 05
type: execute
wave: 1
depends_on:
- 02-01
files_modified:
- SharepointToolbox/Localization/Strings.resx
- SharepointToolbox/Localization/Strings.fr.resx
- SharepointToolbox/Localization/Strings.Designer.cs
autonomous: true
requirements:
- PERM-01
- PERM-02
- PERM-04
- PERM-05
- PERM-06
must_haves:
truths:
- "All Phase 2 UI string keys exist in Strings.resx with English values"
- "All Phase 2 UI string keys exist in Strings.fr.resx with French values (no English fallback — all keys translated)"
- "Strings.Designer.cs contains a static property for each new key"
- "Application still builds and existing localization tests pass"
artifacts:
- path: "SharepointToolbox/Localization/Strings.resx"
provides: "English strings for Phase 2 UI"
contains: "grp.scan.opts"
- path: "SharepointToolbox/Localization/Strings.fr.resx"
provides: "French translations for Phase 2 UI"
contains: "grp.scan.opts"
- path: "SharepointToolbox/Localization/Strings.Designer.cs"
provides: "Static C# accessors for all string keys"
key_links:
- from: "PermissionsView.xaml"
to: "Strings.Designer.cs"
via: "TranslationSource binding"
pattern: "TranslationSource"
---
<objective>
Add all Phase 2 localization keys (EN + FR) to the existing resx files and update Strings.Designer.cs. This plan runs in Wave 1 parallel to Plans 02 and 03 because it only touches localization files.
Purpose: Phase 2 UI views reference localization keys. All keys must exist before the Views and ViewModels can bind to them.
Output: Updated Strings.resx, Strings.fr.resx, Strings.Designer.cs with 15 new keys.
</objective>
<execution_context>
@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/phases/02-permissions/02-RESEARCH.md
<interfaces>
<!-- Localization key naming convention from Phase 1 -->
<!-- Keys use dot.notation: prefix.noun or prefix.verb.noun -->
<!-- Values in Strings.resx are English; Strings.fr.resx are French -->
<!-- Strings.Designer.cs is maintained manually (ResXFileCodeGenerator is VS-only) -->
<!-- Example existing key: btn.login="Log In" / btn.connexion="Se connecter" -->
Phase 2 keys to add (from PS reference lines 2751-2761):
```
Key English Value French Value
---- ---------------- ---------------
grp.scan.opts Scan Options Options d'analyse
chk.scan.folders Scan Folders Analyser les dossiers
chk.recursive Recursive (subsites) Récursif (sous-sites)
lbl.folder.depth Folder depth: Profondeur des dossiers :
chk.max.depth Maximum (all levels) Maximum (tous les niveaux)
chk.inherited.perms Include Inherited Permissions Inclure les permissions héritées
grp.export.fmt Export Format Format d'export
rad.csv.perms CSV CSV
rad.html.perms HTML HTML
btn.gen.perms Generate Report Générer le rapport
btn.open.perms Open Report Ouvrir le rapport
btn.view.sites View Sites Voir les sites
perm.site.url Site URL: URL du site :
perm.or.select or select multiple sites: ou sélectionnez plusieurs sites :
perm.sites.selected {0} site(s) selected {0} site(s) sélectionné(s)
```
Strings.Designer.cs pattern (existing):
```csharp
// Each key becomes a static property:
public static string grp_scan_opts => ResourceManager.GetString("grp.scan.opts", resourceCulture) ?? string.Empty;
// Note: dots in key names become underscores in C# property names
```
</interfaces>
</context>
<tasks>
<task type="auto">
<name>Task 1: Add Phase 2 localization keys to resx files and Designer</name>
<files>
SharepointToolbox/Localization/Strings.resx
SharepointToolbox/Localization/Strings.fr.resx
SharepointToolbox/Localization/Strings.Designer.cs
</files>
<action>
IMPORTANT: These are XML files — read each file first before modifying to understand the existing structure and avoid breaking it.
Step 1: Add the following 15 `<data>` entries to Strings.resx (English), inside the `<root>` element, after the last existing `<data>` block:
```xml
<data name="grp.scan.opts" xml:space="preserve"><value>Scan Options</value></data>
<data name="chk.scan.folders" xml:space="preserve"><value>Scan Folders</value></data>
<data name="chk.recursive" xml:space="preserve"><value>Recursive (subsites)</value></data>
<data name="lbl.folder.depth" xml:space="preserve"><value>Folder depth:</value></data>
<data name="chk.max.depth" xml:space="preserve"><value>Maximum (all levels)</value></data>
<data name="chk.inherited.perms" xml:space="preserve"><value>Include Inherited Permissions</value></data>
<data name="grp.export.fmt" xml:space="preserve"><value>Export Format</value></data>
<data name="rad.csv.perms" xml:space="preserve"><value>CSV</value></data>
<data name="rad.html.perms" xml:space="preserve"><value>HTML</value></data>
<data name="btn.gen.perms" xml:space="preserve"><value>Generate Report</value></data>
<data name="btn.open.perms" xml:space="preserve"><value>Open Report</value></data>
<data name="btn.view.sites" xml:space="preserve"><value>View Sites</value></data>
<data name="perm.site.url" xml:space="preserve"><value>Site URL:</value></data>
<data name="perm.or.select" xml:space="preserve"><value>or select multiple sites:</value></data>
<data name="perm.sites.selected" xml:space="preserve"><value>{0} site(s) selected</value></data>
```
Step 2: Add the same 15 `<data>` entries to Strings.fr.resx (French) with the French values from the table above. All values must be genuine French — no copying English values.
Step 3: Add 15 static properties to Strings.Designer.cs, following the exact pattern of existing properties. Dots in key names become underscores:
```csharp
public static string grp_scan_opts => ResourceManager.GetString("grp.scan.opts", resourceCulture) ?? string.Empty;
public static string chk_scan_folders => ResourceManager.GetString("chk.scan.folders", resourceCulture) ?? string.Empty;
public static string chk_recursive => ResourceManager.GetString("chk.recursive", resourceCulture) ?? string.Empty;
public static string lbl_folder_depth => ResourceManager.GetString("lbl.folder.depth", resourceCulture) ?? string.Empty;
public static string chk_max_depth => ResourceManager.GetString("chk.max.depth", resourceCulture) ?? string.Empty;
public static string chk_inherited_perms => ResourceManager.GetString("chk.inherited.perms", resourceCulture) ?? string.Empty;
public static string grp_export_fmt => ResourceManager.GetString("grp.export.fmt", resourceCulture) ?? string.Empty;
public static string rad_csv_perms => ResourceManager.GetString("rad.csv.perms", resourceCulture) ?? string.Empty;
public static string rad_html_perms => ResourceManager.GetString("rad.html.perms", resourceCulture) ?? string.Empty;
public static string btn_gen_perms => ResourceManager.GetString("btn.gen.perms", resourceCulture) ?? string.Empty;
public static string btn_open_perms => ResourceManager.GetString("btn.open.perms", resourceCulture) ?? string.Empty;
public static string btn_view_sites => ResourceManager.GetString("btn.view.sites", resourceCulture) ?? string.Empty;
public static string perm_site_url => ResourceManager.GetString("perm.site.url", resourceCulture) ?? string.Empty;
public static string perm_or_select => ResourceManager.GetString("perm.or.select", resourceCulture) ?? string.Empty;
public static string perm_sites_selected => ResourceManager.GetString("perm.sites.selected", resourceCulture) ?? string.Empty;
```
</action>
<verify>
<automated>dotnet test C:/Users/dev/Documents/projets/Sharepoint/SharepointToolbox.Tests/SharepointToolbox.Tests.csproj --filter "FullyQualifiedName~LocalizationTests" -x</automated>
</verify>
<done>Existing LocalizationTests pass. `dotnet build SharepointToolbox.slnx` succeeds. All 15 keys exist in both resx files with correct translations. Strings.Designer.cs has 15 new static properties.</done>
</task>
</tasks>
<verification>
- `dotnet build C:/Users/dev/Documents/projets/Sharepoint/SharepointToolbox.slnx` → 0 errors
- `dotnet test --filter "FullyQualifiedName~LocalizationTests"` → all pass
- Strings.resx and Strings.fr.resx contain the key `grp.scan.opts` (grep verifiable)
- Strings.fr.resx value for `chk.recursive` is "Récursif (sous-sites)" not English
</verification>
<success_criteria>
- All 15 Phase 2 localization keys present in EN and FR resx with genuine translations (no English fallback in FR)
- Strings.Designer.cs has 15 corresponding static properties
- No existing localization tests broken
- Keys are accessible via `TranslationSource.Instance["grp.scan.opts"]` at runtime
</success_criteria>
<output>
After completion, create `.planning/phases/02-permissions/02-05-SUMMARY.md`
</output>