feat(client-ui): Shelve/Confirm context-menu items with per-item enablement

This commit is contained in:
Joseph Doherty
2026-06-16 18:28:19 -04:00
parent a774bb088d
commit 6a61f35ac0
@@ -1,4 +1,5 @@
using System.ComponentModel;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
@@ -31,9 +32,19 @@ public partial class AlarmsView : UserControl
if (grid == null) return;
var contextMenu = new ContextMenu();
var ackItem = new MenuItem { Header = "Acknowledge..." };
ackItem.Click += OnAcknowledgeClicked;
contextMenu.Items.Add(ackItem);
var shelveItem = new MenuItem { Header = "Shelve..." };
shelveItem.Click += OnShelveClicked;
contextMenu.Items.Add(shelveItem);
var confirmItem = new MenuItem { Header = "Confirm..." };
confirmItem.Click += OnConfirmClicked;
contextMenu.Items.Add(confirmItem);
contextMenu.Opening += OnContextMenuOpening;
grid.ContextMenu = contextMenu;
}
@@ -61,7 +72,27 @@ public partial class AlarmsView : UserControl
private void OnContextMenuOpening(object? sender, CancelEventArgs e)
{
var grid = this.FindControl<DataGrid>("AlarmsGrid");
if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanAcknowledge)
if (grid?.SelectedItem is not AlarmEventViewModel alarm)
{
e.Cancel = true;
return;
}
if (grid.ContextMenu is { } menu)
{
foreach (var item in menu.Items.OfType<MenuItem>())
{
item.IsEnabled = item.Header switch
{
"Acknowledge..." => alarm.CanAcknowledge,
"Shelve..." => alarm.CanShelve,
"Confirm..." => alarm.CanConfirm,
_ => true
};
}
}
if (!alarm.CanAcknowledge && !alarm.CanShelve && !alarm.CanConfirm)
e.Cancel = true;
}
@@ -78,4 +109,24 @@ public partial class AlarmsView : UserControl
var ackWindow = new AckAlarmWindow(vm, alarm);
ackWindow.ShowDialog(parentWindow);
}
private void OnShelveClicked(object? sender, RoutedEventArgs e)
{
if (DataContext is not AlarmsViewModel vm) return;
var grid = this.FindControl<DataGrid>("AlarmsGrid");
if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanShelve) return;
var parentWindow = this.FindAncestorOfType<Window>();
if (parentWindow == null) return;
new ShelveAlarmWindow(vm, alarm).ShowDialog(parentWindow);
}
private void OnConfirmClicked(object? sender, RoutedEventArgs e)
{
if (DataContext is not AlarmsViewModel vm) return;
var grid = this.FindControl<DataGrid>("AlarmsGrid");
if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanConfirm) return;
var parentWindow = this.FindAncestorOfType<Window>();
if (parentWindow == null) return;
new ConfirmAlarmWindow(vm, alarm).ShowDialog(parentWindow);
}
}