feat(installer): add SystemCheckPage with blocking-error gating
Adds a new wizard page (positioned right after Welcome, FreshInstall only) that auto-runs EnvironmentCheckService on entry and shows one row per check with status icon, localized title/message, and hint+help-link on failure/unknown. A "Recheck" button re-runs it, guarded against re-entrancy. IInstallerPage gets a BlocksNavigation default member; WizardViewModel's Next button now binds to CanGoNext, which the current page can veto (used here while a check run is in flight or a blocking Error+Failed result is present — Warnings and Unknown results never block). The summary line names the blocking checks so a disabled Next is self-explanatory. Wires up DI for the check pipeline (IProcessRunner, IPortOwnerResolver, per-run ClaudeCliLookup) and adds the checks.* / installer.systemCheck.* locale keys in en.json + de.json. Visual appearance is NOT verified — needs a manual pass in the running installer.
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using ClaudeDo.Installer.Core;
|
||||
@@ -32,10 +33,12 @@ public partial class WizardViewModel : ObservableObject
|
||||
[NotifyPropertyChangedFor(nameof(IsLastPage))]
|
||||
[NotifyPropertyChangedFor(nameof(NextButtonText))]
|
||||
[NotifyPropertyChangedFor(nameof(CurrentPage))]
|
||||
[NotifyPropertyChangedFor(nameof(CanGoNext))]
|
||||
private int _currentPageIndex;
|
||||
|
||||
public IInstallerPage CurrentPage => Pages[CurrentPageIndex];
|
||||
public bool CanGoBack => CurrentPageIndex > 0;
|
||||
public bool CanGoNext => !CurrentPage.BlocksNavigation;
|
||||
public bool IsLastPage => CurrentPageIndex == Pages.Count - 1;
|
||||
public string NextButtonText => IsLastPage
|
||||
? (_localizer["installer.nav.install"])
|
||||
@@ -58,6 +61,14 @@ public partial class WizardViewModel : ObservableObject
|
||||
|| p is InstallPageViewModel).ToList()
|
||||
: all;
|
||||
|
||||
// A page's blocking state (e.g. a running/failed system check) can change while it's
|
||||
// displayed; re-evaluate CanGoNext whenever any page raises a property change.
|
||||
foreach (var page in Pages)
|
||||
{
|
||||
if (page is INotifyPropertyChanged notifying)
|
||||
notifying.PropertyChanged += (_, _) => OnPropertyChanged(nameof(CanGoNext));
|
||||
}
|
||||
|
||||
if (Pages.Count > 0)
|
||||
_ = InitAsync();
|
||||
}
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
|
||||
<Button Grid.Column="2" Content="{Binding NextButtonText}"
|
||||
Command="{Binding GoNextCommand}"
|
||||
IsEnabled="{Binding CanGoNext}"
|
||||
Style="{StaticResource AccentButton}"
|
||||
MinWidth="100"/>
|
||||
</Grid>
|
||||
|
||||
Reference in New Issue
Block a user