feat(centralui): extract AlarmStateBadges shared component from DebugView (T13)

This commit is contained in:
Joseph Doherty
2026-06-18 02:02:09 -04:00
parent 77a31ba994
commit bf1f2f6892
3 changed files with 143 additions and 62 deletions
@@ -209,33 +209,7 @@
{
<span class="text-info me-1" aria-label="Has operator message">💬</span>
}
<span class="badge @GetAlarmStateBadge(node.Alarm.State) me-1"
aria-label="@($"Alarm state: {node.Alarm.State}")">@node.Alarm.State</span>
<span class="badge @GetKindBadge(node.Alarm.Kind) me-1"
aria-label="@($"Alarm kind: {node.Alarm.Kind}")">@FormatKind(node.Alarm.Kind)</span>
@if (node.Alarm.Kind != AlarmKind.Computed)
{
@if (node.Alarm.Condition.Active && !node.Alarm.Condition.Acknowledged)
{
<span class="badge bg-warning text-dark me-1" aria-label="Unacknowledged">Unacked</span>
}
@if (node.Alarm.Condition.Shelve != AlarmShelveState.Unshelved)
{
<span class="badge bg-info text-dark me-1" title="@node.Alarm.Condition.Shelve"
aria-label="@($"Shelved: {node.Alarm.Condition.Shelve}")">Shelved</span>
}
@if (node.Alarm.Condition.Suppressed)
{
<span class="badge bg-info text-dark me-1" aria-label="Suppressed">Suppressed</span>
}
}
<span class="font-monospace small text-muted me-1"
aria-label="@($"Severity: {node.Alarm.Condition.Severity}")">sev @node.Alarm.Condition.Severity</span>
@if (node.Alarm.Level != AlarmLevel.None)
{
<span class="badge @GetAlarmLevelBadge(node.Alarm.Level) me-1"
aria-label="@($"Alarm level: {node.Alarm.Level}")">@FormatLevel(node.Alarm.Level)</span>
}
<AlarmStateBadges Alarm="node.Alarm" />
}
else if (node.IsNativeBinding)
{
@@ -577,6 +551,10 @@
_ => "bg-secondary"
};
/// <summary>
/// State badge class shared by the alarm leaf (via <c>AlarmStateBadges</c>)
/// and the native/composition branch summary badges below (worst-state roll-up).
/// </summary>
private static string GetAlarmStateBadge(AlarmState state) => state switch
{
AlarmState.Active => "bg-danger",
@@ -584,32 +562,6 @@
_ => "bg-secondary"
};
/// <summary>
/// Severity-tinted badge class for HiLo alarm levels. The critical bands
/// (HighHigh / LowLow) get the danger class; warning bands get amber.
/// </summary>
private static string GetAlarmLevelBadge(AlarmLevel level) => level switch
{
AlarmLevel.HighHigh or AlarmLevel.LowLow => "bg-danger",
AlarmLevel.High or AlarmLevel.Low => "bg-warning text-dark",
_ => "bg-secondary"
};
/// <summary>Badge class distinguishing computed (neutral) from native (info) alarms.</summary>
private static string GetKindBadge(AlarmKind kind) => kind switch
{
AlarmKind.Computed => "bg-secondary",
_ => "bg-info text-dark"
};
/// <summary>Short display label for the alarm kind.</summary>
private static string FormatKind(AlarmKind kind) => kind switch
{
AlarmKind.NativeOpcUa => "OPC UA",
AlarmKind.NativeMxAccess => "MxAccess",
_ => "Computed"
};
/// <summary>
/// Builds the row tooltip from the alarm's operator message plus native
/// metadata (type, category, operator, raise time, current/limit value).
@@ -629,15 +581,6 @@
return parts.Count == 0 ? null : string.Join(" · ", parts);
}
private static string FormatLevel(AlarmLevel level) => level switch
{
AlarmLevel.HighHigh => "HiHi",
AlarmLevel.High => "Hi",
AlarmLevel.Low => "Lo",
AlarmLevel.LowLow => "LoLo",
_ => "—"
};
/// <summary>
/// Runs <paramref name="action"/> on the render thread, guarded against the
/// component being disposed mid-flight (CentralUI-009): <c>InvokeAsync</c>
@@ -0,0 +1,80 @@
@using ZB.MOM.WW.ScadaBridge.Commons.Messages.Streaming
@using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums
@* ── Alarm leaf badge cluster ── *@
@* State / kind / native sub-state / severity / HiLo level badges for one alarm. *@
@* Lifted verbatim from DebugView so the Alarm Summary page renders identically. *@
<span class="badge @GetAlarmStateBadge(Alarm.State) me-1"
aria-label="@($"Alarm state: {Alarm.State}")">@Alarm.State</span>
<span class="badge @GetKindBadge(Alarm.Kind) me-1"
aria-label="@($"Alarm kind: {Alarm.Kind}")">@FormatKind(Alarm.Kind)</span>
@if (Alarm.Kind != AlarmKind.Computed)
{
@if (Alarm.Condition.Active && !Alarm.Condition.Acknowledged)
{
<span class="badge bg-warning text-dark me-1" aria-label="Unacknowledged">Unacked</span>
}
@if (Alarm.Condition.Shelve != AlarmShelveState.Unshelved)
{
<span class="badge bg-info text-dark me-1" title="@Alarm.Condition.Shelve"
aria-label="@($"Shelved: {Alarm.Condition.Shelve}")">Shelved</span>
}
@if (Alarm.Condition.Suppressed)
{
<span class="badge bg-info text-dark me-1" aria-label="Suppressed">Suppressed</span>
}
}
<span class="font-monospace small text-muted me-1"
aria-label="@($"Severity: {Alarm.Condition.Severity}")">sev @Alarm.Condition.Severity</span>
@if (Alarm.Level != AlarmLevel.None)
{
<span class="badge @GetAlarmLevelBadge(Alarm.Level) me-1"
aria-label="@($"Alarm level: {Alarm.Level}")">@FormatLevel(Alarm.Level)</span>
}
@code {
/// <summary>The alarm condition whose badges this component renders.</summary>
[Parameter] public AlarmStateChanged Alarm { get; set; } = default!;
private static string GetAlarmStateBadge(AlarmState state) => state switch
{
AlarmState.Active => "bg-danger",
AlarmState.Normal => "bg-success",
_ => "bg-secondary"
};
/// <summary>
/// Severity-tinted badge class for HiLo alarm levels. The critical bands
/// (HighHigh / LowLow) get the danger class; warning bands get amber.
/// </summary>
private static string GetAlarmLevelBadge(AlarmLevel level) => level switch
{
AlarmLevel.HighHigh or AlarmLevel.LowLow => "bg-danger",
AlarmLevel.High or AlarmLevel.Low => "bg-warning text-dark",
_ => "bg-secondary"
};
/// <summary>Badge class distinguishing computed (neutral) from native (info) alarms.</summary>
private static string GetKindBadge(AlarmKind kind) => kind switch
{
AlarmKind.Computed => "bg-secondary",
_ => "bg-info text-dark"
};
/// <summary>Short display label for the alarm kind.</summary>
private static string FormatKind(AlarmKind kind) => kind switch
{
AlarmKind.NativeOpcUa => "OPC UA",
AlarmKind.NativeMxAccess => "MxAccess",
_ => "Computed"
};
private static string FormatLevel(AlarmLevel level) => level switch
{
AlarmLevel.HighHigh => "HiHi",
AlarmLevel.High => "Hi",
AlarmLevel.Low => "Lo",
AlarmLevel.LowLow => "LoLo",
_ => "—"
};
}