add Update History

- add Computername into DataGrid (if needed)
- add toggle for Update History
- add Update History interface
- add Update Interface Toggle Logic
- add Update scan logic
- initialize Update selected / all logic
- center specific datagrid columns
This commit is contained in:
MyDrift 2025-03-04 20:46:06 +01:00
parent eea96f596e
commit e830ff03b1
8 changed files with 245 additions and 52 deletions

View File

@ -61,6 +61,10 @@ function Invoke-WPFButton {
"WPFWinUtilInstallPSProfile" {Invoke-WinUtilInstallPSProfile}
"WPFWinUtilUninstallPSProfile" {Invoke-WinUtilUninstallPSProfile}
"WPFWinUtilSSHServer" {Invoke-WPFSSHServer}
"WPFScanUpdates" {Invoke-WPFScanUpdates}
"WPFScanUpdates" {Invoke-WPFUpdatesScan}
"WPFShowUpdateHistory" { Invoke-WPFUpdateHistoryToggle }
"WPFUpdateSelectedInstall" {Invoke-WPFUpdateMGMT -Selected}
"WPFUpdateAllInstall" {Invoke-WPFUpdateMGMT -All}
"WPFUpdateScanHistory" {Invoke-WPFUpdateScanHistory}
}
}

View File

@ -0,0 +1,11 @@
function Invoke-WPFUpdateHistoryToggle {
if ($sync["WPFShowUpdateHistory"].Content -eq "Show History") {
$sync["WPFShowUpdateHistory"].Content = "Show available Updates"
$sync["HistoryGrid"].Visibility = "Visible"
$sync["UpdatesGrid"].Visibility = "Collapsed"
} else {
$sync["WPFShowUpdateHistory"].Content = "Show History"
$sync["HistoryGrid"].Visibility = "Collapsed"
$sync["UpdatesGrid"].Visibility = "Visible"
}
}

View File

@ -0,0 +1,13 @@
function Invoke-WPFUpdateMGMT {
param (
[switch]$Selected,
[switch]$All
)
if ($Selected) {
write-host "Installing selected updates"
} elseif ($All) {
Write-Host "Installing all available updates"
}
}

View File

@ -0,0 +1,46 @@
function Invoke-WPFUpdateScanHistory {
$sync["WPFUpdateHistory"].Items.Clear()
Invoke-WPFRunspace -DebugPreference $DebugPreference -ScriptBlock {
write-host "Scanning for Windows update history..."
$UpdateHistory = Get-WUHistory -Last 50 -ErrorAction SilentlyContinue
if ($UpdateHistory) {
foreach ($update in $UpdateHistory) {
$item = New-Object PSObject -Property @{
ComputerName = $update.ComputerName
Result = $update.Result
Title = $update.Title -replace '\s*\(KB\d+\)', '' -replace '\s*KB\d+\b', '' # Remove KB number from title, first in parentheses, then standalone
KB = $update.KB
Date = $update.Date
}
$Computers = $item | Select-Object -ExpandProperty ComputerName -Unique
$sync.form.Dispatcher.Invoke([action] {
$sync["WPFUpdateHistory"].Items.Add($item)
if ($item.Result -eq "Succeeded") {
# does not work : $sync["WPFUpdateHistory"].Items[$sync["WPFUpdateHistory"].Items.Count - 1].Foreground = "Green"
#write-host "$($item.Title) was successful"
}
elseif ($item.Result -eq "Failed") {
# does not work : $sync["WPFUpdateHistory"].Items[$sync["WPFUpdateHistory"].Items.Count - 1].Foreground = "Red"
#write-host "$($item.Title) failed"
}
})
}
write-host "Found $($UpdateHistory.Count) updates."
$sync.form.Dispatcher.Invoke([action] {
if ($Computers.Count -gt 1) {
$sync["WPFUpdateHistory"].Columns[0].Visibility = "Visible"
}
else {
Write-Debug "Hiding ComputerName column, only $item.ComputerName"
$sync["WPFUpdateHistory"].Columns[0].Visibility = "Collapsed"
}
})
}
else {
$sync.form.Dispatcher.Invoke([action] {
$sync["WPFUpdateHistory"].Items.Clear()
})
Write-Host "No update history available."
}
}
}

View File

@ -1,4 +1,4 @@
function Invoke-WPFScanUpdates {
function Invoke-WPFUpdatesScan {
Invoke-WPFRunspace -DebugPreference $DebugPreference -ScriptBlock {
@ -26,7 +26,6 @@ function Invoke-WPFScanUpdates {
}
try {
Write-Host "Clearing updates list..."
$sync.form.Dispatcher.Invoke([action] { $sync["WPFUpdatesList"].Items.Clear() })
Write-Host "Scanning for Windows updates..."
$updates = Get-WindowsUpdate -ErrorAction Stop
@ -35,13 +34,21 @@ function Invoke-WPFScanUpdates {
$sync.form.Dispatcher.Invoke([action] {
foreach ($update in $updates) {
$item = New-Object PSObject -Property @{
ComputerName = $update.ComputerName
KB = $update.KB
Size = $update.Size
Title = $update.Title -replace '\s*\(KB\d+\)', '' -replace '\s*KB\d+\b', '' # Remove KB number from title, first in parentheses, then standalone
Status = "Not Installed"
}
$Computers = $item | Select-Object -ExpandProperty ComputerName -Unique
$sync["WPFUpdatesList"].Items.Add($item)
}
if ($Computers.Count -gt 1) {
$sync["WPFUpdatesList"].Columns[0].Visibility = "Visible"
} else {
Write-Debug "Hiding ComputerName column, only $item.ComputerName"
$sync["WPFUpdatesList"].Columns[0].Visibility = "Collapsed"
}
})
} catch {
Write-Error "Error scanning for updates: $_"

View File

@ -1308,7 +1308,7 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Updates" Visibility="Collapsed" Name="WPFTab4">
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{DynamicResource TabContentMargin}">
<!-- <ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{DynamicResource TabContentMargin}"> -->
<Grid Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
@ -1349,6 +1349,23 @@
<!-- Right Column - Updates List -->
<Border Grid.Column="1" Style="{StaticResource BorderStyle}" VerticalAlignment="Stretch">
<Grid Margin="5,0,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Toggle button at the top -->
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Right" Margin="5">
<ToggleButton Name="WPFShowUpdateHistory"
Content="Show History"
Style="{StaticResource ToggleButtonStyle}"
Margin="5"
Padding="10,5"
ToolTip="Toggle between pending updates and update history"/>
</StackPanel>
<!-- Updates Grid - Visible by default -->
<Grid Grid.Row="1" Name="UpdatesGrid" Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
@ -1367,20 +1384,50 @@
Margin="5"
AutoGenerateColumns="False"
Background="Transparent"
IsReadOnly="True">
IsReadOnly="True"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.Columns>
<DataGridTextColumn Header="ComputerName"
Binding="{Binding ComputerName}"
Width="Auto"
Visibility="Collapsed"/>
<DataGridTextColumn Header="Title"
Binding="{Binding Title}"
Width="*"/>
Width="*"
MinWidth="100"/>
<DataGridTextColumn Header="KB"
Binding="{Binding KB}"
Width="100"/>
Width="Auto"
MinWidth="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Size"
Binding="{Binding Size}"
Width="80"/>
Width="Auto"
MinWidth="80">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Status"
Binding="{Binding Status}"
Width="100"/>
Width="Auto"
MinWidth="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
@ -1388,16 +1435,81 @@
Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="5">
<Button Name="WPFInstallSelected"
<Button Name="WPFUpdateSelectedInstall"
Content="Install Selected"
Margin="5"
Padding="10,5"/>
<Button Name="WPFInstallAll"
<Button Name="WPFUpdateAllInstall"
Content="Install All"
Margin="5"
Padding="10,5"/>
</StackPanel>
</Grid>
<!-- History Grid - Collapsed by default -->
<Grid Grid.Row="1" Name="HistoryGrid" Visibility="Collapsed">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Name="WPFUpdateScanHistory"
Content="Scan History"
Grid.Row="0"
Margin="5"
HorizontalAlignment="Left"
Padding="10,5"/>
<DataGrid Name="WPFUpdateHistory"
Grid.Row="1"
Margin="5"
AutoGenerateColumns="False"
Background="Transparent"
IsReadOnly="True"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.Columns>
<DataGridTextColumn Header="ComputerName"
Binding="{Binding ComputerName}"
Width="Auto"
Visibility="Collapsed"/>
<DataGridTextColumn Header="Result"
Binding="{Binding Result}"
Width="Auto"
MinWidth="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Title"
Binding="{Binding Title}"
Width="*"/>
<DataGridTextColumn Header="KB"
Binding="{Binding KB}"
Width="Auto"
MinWidth="100">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Date"
Binding="{Binding Date}"
Width="Auto"
MinWidth="160">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
</Border>
</Grid>
@ -1409,7 +1521,7 @@
</StackPanel>
</Border>
</Grid>
</ScrollViewer>
<!-- </ScrollViewer> -->
</TabItem>
<TabItem Header="MicroWin" Visibility="Collapsed" Name="WPFTab5">
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{DynamicResource TabContentMargin}">