diff --git a/.planning/phases/01-foundation/01-04-PLAN.md b/.planning/phases/01-foundation/01-04-PLAN.md index d6e6cb1..0c2c856 100644 --- a/.planning/phases/01-foundation/01-04-PLAN.md +++ b/.planning/phases/01-foundation/01-04-PLAN.md @@ -2,7 +2,7 @@ phase: 01-foundation plan: 04 type: execute -wave: 3 +wave: 4 depends_on: - 01-02 - 01-03 diff --git a/.planning/phases/01-foundation/01-06-PLAN.md b/.planning/phases/01-foundation/01-06-PLAN.md index 44f68c6..8fece7e 100644 --- a/.planning/phases/01-foundation/01-06-PLAN.md +++ b/.planning/phases/01-foundation/01-06-PLAN.md @@ -2,7 +2,7 @@ phase: 01-foundation plan: 06 type: execute -wave: 4 +wave: 5 depends_on: - 01-03 - 01-04 @@ -13,6 +13,8 @@ files_modified: - SharepointToolbox/ViewModels/MainWindowViewModel.cs - SharepointToolbox/ViewModels/ProfileManagementViewModel.cs - SharepointToolbox/ViewModels/Tabs/SettingsViewModel.cs + - SharepointToolbox/Views/Controls/FeatureTabBase.xaml + - SharepointToolbox/Views/Controls/FeatureTabBase.xaml.cs - SharepointToolbox/Views/MainWindow.xaml - SharepointToolbox/Views/MainWindow.xaml.cs - SharepointToolbox/App.xaml.cs @@ -31,6 +33,8 @@ must_haves: - "Global exception handlers (DispatcherUnhandledException + TaskScheduler.UnobservedTaskException) funnel to log panel + MessageBox" - "LogPanelSink wired to MainWindow RichTextBox after Generic Host starts" - "FeatureViewModelBaseTests: progress reporting, cancellation, and error handling all green" + - "All 7 stub feature tabs use FeatureTabBase UserControl — ProgressBar + TextBlock + Cancel button shown only when IsRunning" + - "StatusBar middle item shows live operation status text (ProgressStatus from ProgressUpdatedMessage), not static ConnectionStatus" artifacts: - path: "SharepointToolbox/ViewModels/FeatureViewModelBase.cs" provides: "Base class for all feature ViewModels with canonical async command pattern" @@ -38,6 +42,9 @@ must_haves: - path: "SharepointToolbox/ViewModels/MainWindowViewModel.cs" provides: "Shell ViewModel with TenantProfiles and connection state" contains: "ObservableCollection" + - path: "SharepointToolbox/Views/Controls/FeatureTabBase.xaml" + provides: "Reusable UserControl with ProgressBar + TextBlock + Cancel button strip" + contains: "ProgressBar" - path: "SharepointToolbox/Views/MainWindow.xaml" provides: "WPF shell with toolbar, TabControl, log panel, StatusBar" contains: "RichTextBox" @@ -56,15 +63,23 @@ must_haves: pattern: "TenantSwitchedMessage" - from: "SharepointToolbox/ViewModels/MainWindowViewModel.cs" to: "SharepointToolbox/Core/Messages/ProgressUpdatedMessage.cs" - via: "Messenger.Register in OnActivated — updates StatusBar observable properties" + via: "Messenger.Register in OnActivated — updates ProgressStatus + ProgressPercentage" pattern: "ProgressUpdatedMessage" + - from: "SharepointToolbox/Views/MainWindow.xaml StatusBar middle item" + to: "SharepointToolbox/ViewModels/MainWindowViewModel.cs ProgressStatus" + via: "Binding Content={Binding ProgressStatus}" + pattern: "ProgressStatus" + - from: "SharepointToolbox/Views/MainWindow.xaml stub TabItems" + to: "SharepointToolbox/Views/Controls/FeatureTabBase.xaml" + via: "TabItem Content contains " + pattern: "FeatureTabBase" --- -Build the WPF shell — MainWindow XAML + all ViewModels. Wire LogPanelSink to the RichTextBox. Implement FeatureViewModelBase with the canonical async pattern. Register global exception handlers. +Build the WPF shell — MainWindow XAML + all ViewModels. Wire LogPanelSink to the RichTextBox. Implement FeatureViewModelBase with the canonical async pattern. Create FeatureTabBase UserControl (per-tab progress/cancel strip). Register global exception handlers. -Purpose: This is the first time the application visually exists. All subsequent feature plans add TabItems to the already-wired TabControl. -Output: Runnable WPF application showing the shell with placeholder tabs, log panel, and status bar. +Purpose: This is the first time the application visually exists. All subsequent feature plans add TabItems to the already-wired TabControl. FeatureTabBase gives Phase 2+ a XAML template to extend rather than stub TextBlocks. +Output: Runnable WPF application showing the shell with placeholder tabs (using FeatureTabBase), log panel, and status bar with live operation text. @@ -109,7 +124,8 @@ public sealed class LanguageChangedMessage : ValueChangedMessage // Toolbar (L→R): ComboBox (220px) → Button "Connect" → Button "Manage Profiles..." → separator → Button "Clear Session" // TabControl: 8 tabs (Permissions, Storage, File Search, Duplicates, Templates, Bulk Operations, Folder Structure, Settings) // Log panel: RichTextBox, 150px tall, always visible, x:Name="LogPanel" -// StatusBar: tenant name | operation status | progress % +// StatusBar: tenant name | operation status text | progress % +// Per-tab layout: ProgressBar + TextBlock + Button "Cancel" — shown only when IsRunning (CONTEXT.md Gray Areas, locked) @@ -238,8 +254,10 @@ public sealed class LanguageChangedMessage : ValueChangedMessage - Task 2: MainWindowViewModel, shell ViewModels, and MainWindow XAML + Task 2: FeatureTabBase UserControl, MainWindowViewModel, shell ViewModels, and MainWindow XAML + SharepointToolbox/Views/Controls/FeatureTabBase.xaml, + SharepointToolbox/Views/Controls/FeatureTabBase.xaml.cs, SharepointToolbox/ViewModels/MainWindowViewModel.cs, SharepointToolbox/ViewModels/ProfileManagementViewModel.cs, SharepointToolbox/ViewModels/Tabs/SettingsViewModel.cs, @@ -248,7 +266,53 @@ public sealed class LanguageChangedMessage : ValueChangedMessage SharepointToolbox/App.xaml.cs - Create `ViewModels/Tabs/` and `Views/` directories. + Create `Views/Controls/`, `ViewModels/Tabs/`, and `Views/` directories. + + **FeatureTabBase.xaml** — UserControl that every stub feature tab uses as its Content. + This gives Phase 2+ a concrete XAML template to replace rather than a bare TextBlock. + The progress/cancel strip is Visibility-bound to IsRunning per the locked CONTEXT.md decision. + + ```xml + + + + + + + + + + + + + + + + + + + +