chore: complete v1.0 milestone
All checks were successful
Release zip package / release (push) Successful in 10s
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:
171
.planning/milestones/v1.0-phases/02-permissions/02-05-PLAN.md
Normal file
171
.planning/milestones/v1.0-phases/02-permissions/02-05-PLAN.md
Normal 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>
|
||||
Reference in New Issue
Block a user