From 6a61f35ac0f735d78e33ec2cec65c8bdf132259a Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 16 Jun 2026 18:28:19 -0400 Subject: [PATCH] feat(client-ui): Shelve/Confirm context-menu items with per-item enablement --- .../Views/AlarmsView.axaml.cs | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Client/ZB.MOM.WW.OtOpcUa.Client.UI/Views/AlarmsView.axaml.cs b/src/Client/ZB.MOM.WW.OtOpcUa.Client.UI/Views/AlarmsView.axaml.cs index 10d902c2..0c903202 100644 --- a/src/Client/ZB.MOM.WW.OtOpcUa.Client.UI/Views/AlarmsView.axaml.cs +++ b/src/Client/ZB.MOM.WW.OtOpcUa.Client.UI/Views/AlarmsView.axaml.cs @@ -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("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()) + { + 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("AlarmsGrid"); + if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanShelve) return; + var parentWindow = this.FindAncestorOfType(); + 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("AlarmsGrid"); + if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanConfirm) return; + var parentWindow = this.FindAncestorOfType(); + if (parentWindow == null) return; + new ConfirmAlarmWindow(vm, alarm).ShowDialog(parentWindow); + } }