From 88aaf1d947e0aef2255d748b4aa6625e260a605f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 10 Aug 2026 18:01:07 -0400 Subject: [PATCH] =?UTF-8?q?ui(density):=20truncation=20sweep=20=E2=80=94?= =?UTF-8?q?=20Abbreviate=20+=20title=20on=20unbounded=20backend/free=20tex?= =?UTF-8?q?t=20(=C2=A71d=20Task=201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Pages/Account.razor | 2 +- .../Components/Pages/AlarmsHistorian.razor | 2 +- .../Components/Pages/Alerts.razor | 2 +- .../Components/Pages/Certificates.razor | 4 ++-- .../Pages/Clusters/ClusterAcls.razor | 2 +- .../Pages/Clusters/ClusterAudit.razor | 3 ++- .../Pages/Clusters/ClusterOverview.razor | 6 +++--- .../Pages/Clusters/ClusterRedundancy.razor | 2 +- .../Components/Pages/Fleet.razor | 2 +- .../Components/Pages/RoleGrants.razor | 6 +++--- .../Components/Pages/ScriptLog.razor | 2 +- .../Shared/Drivers/DriverStatusPanel.razor | 20 ++++++++++++++----- .../Shared/Drivers/DriverTagPicker.razor | 2 +- .../Pickers/AbCipAddressPickerBody.razor | 2 +- .../Pickers/FOCASAddressPickerBody.razor | 2 +- .../Pickers/GalaxyAddressPickerBody.razor | 2 +- .../OpcUaClientAddressPickerBody.razor | 2 +- .../Pickers/SqlAddressPickerBody.razor | 8 +++----- .../Pickers/TwinCATAddressPickerBody.razor | 2 +- 19 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Account.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Account.razor index 62823be1..da2a4ffd 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Account.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Account.razor @@ -60,7 +60,7 @@ { @foreach (var g in ldapGroups) { - @g + @DisplayText.Abbreviate(g, 40) } } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/AlarmsHistorian.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/AlarmsHistorian.razor index 55c3be0f..751d759b 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/AlarmsHistorian.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/AlarmsHistorian.razor @@ -38,7 +38,7 @@ else
Last success@(_status.LastSuccessUtc?.ToString("u") ?? "—")
@if (!string.IsNullOrWhiteSpace(_status.LastError)) { -
Last error@_status.LastError
+
Last error@DisplayText.Abbreviate(_status.LastError, 80)
} diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor index 58dd2250..da30583b 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor @@ -81,7 +81,7 @@ else @e.TransitionKind @e.Severity @e.User - @e.Message + @DisplayText.Abbreviate(e.Message, 80) @if (_canOperate) { @* DriverOperator-gated Acknowledge / Shelve / Unshelve. Each routes through diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Certificates.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Certificates.razor index ebeb9c3a..3c8b4d0b 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Certificates.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Certificates.razor @@ -74,8 +74,8 @@ else @foreach (var c in store.Certificates) { - @c.Subject - @c.Issuer + @DisplayText.Abbreviate(c.Subject, 48) + @DisplayText.Abbreviate(c.Issuer, 48) @DisplayText.Abbreviate(c.Thumbprint, 16) @c.NotBefore.ToString("u") @c.NotAfter.ToString("u") diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAcls.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAcls.razor index 8c1c63f4..b3ef922a 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAcls.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAcls.razor @@ -85,7 +85,7 @@ else @perm } - @(a.Notes ?? "") + @(string.IsNullOrEmpty(a.Notes) ? "" : DisplayText.Abbreviate(a.Notes, 60)) Edit } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAudit.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAudit.razor index 7ae6baa5..f7131fca 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAudit.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterAudit.razor @@ -52,7 +52,8 @@ else @a.EventType @(a.NodeId ?? "—") @(a.CorrelationId?.ToString("N")[..8] ?? "—") - + @(a.DetailsJson ?? "") diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterOverview.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterOverview.razor index 051ff6db..c9070c49 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterOverview.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterOverview.razor @@ -46,7 +46,7 @@ else } @if (!string.IsNullOrWhiteSpace(_cluster.Notes)) { -
Notes@_cluster.Notes
+
Notes@DisplayText.Abbreviate(_cluster.Notes, 120)
} @@ -97,9 +97,9 @@ else { @n.NodeId - @n.Host + @DisplayText.Abbreviate(n.Host, 30) @n.OpcUaPort - @n.ApplicationUri + @DisplayText.Abbreviate(n.ApplicationUri, 40) @n.ServiceLevelBase Edit diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterRedundancy.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterRedundancy.razor index 9e11a1c9..507ab9f3 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterRedundancy.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/ClusterRedundancy.razor @@ -125,7 +125,7 @@ else { @n.NodeId - @n.ApplicationUri + @DisplayText.Abbreviate(n.ApplicationUri, 40) @n.ServiceLevelBase @if (n.ServiceLevelBase >= 200) { Primary preference } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Fleet.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Fleet.razor index b620daa8..fbf97694 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Fleet.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Fleet.razor @@ -89,7 +89,7 @@ else @StatusLabel(r.Status) @(r.AppliedAtUtc?.ToString("u") ?? "—") @(r.StartedAtUtc?.ToString("u") ?? "—") - @(r.FailureReason ?? "") + @(string.IsNullOrEmpty(r.FailureReason) ? "" : DisplayText.Abbreviate(r.FailureReason, 80)) } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/RoleGrants.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/RoleGrants.razor index afa68372..51f99111 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/RoleGrants.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/RoleGrants.razor @@ -21,7 +21,7 @@
Enabled@(_options.Enabled ? "yes" : "no")
Server@_options.Server:@_options.Port
Transport@_options.Transport
-
SearchBase@_options.SearchBase
+
SearchBase@DisplayText.Abbreviate(_options.SearchBase, 48)
@if (_options.Transport == ZB.MOM.WW.Auth.Abstractions.Ldap.LdapTransport.None && _options.AllowInsecure) {
WarningPlaintext credentials over LDAP — dev mode only
@@ -62,7 +62,7 @@ @foreach (var r in _rows) { - @r.LdapGroup + @DisplayText.Abbreviate(r.LdapGroup, 48) @r.Role @@ -93,7 +93,7 @@ @foreach (var kvp in _options.GroupToRole.OrderBy(k => k.Key, StringComparer.OrdinalIgnoreCase)) { - @kvp.Key + @DisplayText.Abbreviate(kvp.Key, 48) @kvp.Value } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/ScriptLog.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/ScriptLog.razor index fbe41e43..ebdb8d17 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/ScriptLog.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/ScriptLog.razor @@ -68,7 +68,7 @@ else @if (!string.IsNullOrEmpty(e.AlarmId)) { alarm=@e.AlarmId } @if (!string.IsNullOrEmpty(e.EquipmentId)) { eq=@e.EquipmentId } - @e.Message + @DisplayText.Abbreviate(e.Message, 120) } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverStatusPanel.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverStatusPanel.razor index c1a1db57..4a2a7e10 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverStatusPanel.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverStatusPanel.razor @@ -38,7 +38,7 @@ } else if (_error is not null) { -

SignalR error: @_error

+

SignalR error: @DisplayText.Abbreviate(_error, 60)

} else if (_snapshot is null) { @@ -166,7 +166,7 @@ @if (_opResultMessage is not null) { - @_opResultMessage + @_opResultMessage } @@ -212,7 +212,11 @@ private bool _busyReconnect; private bool _busyRestart; private bool _showRestartConfirm; + // Display text for the op-result chip (truncated at the ShowOpResult choke point) plus the + // untruncated original, which rides the chip's title attribute so the full message stays + // reachable on hover. private string? _opResultMessage; + private string? _opResultMessageFull; private bool _opResultOk; private System.Threading.Timer? _opResultClearTimer; @@ -303,6 +307,7 @@ { _busyReconnect = true; _opResultMessage = null; + _opResultMessageFull = null; StateHasChanged(); try { @@ -315,7 +320,7 @@ } catch (Exception ex) { - ShowOpResult(false, ex.Message.Length > 60 ? ex.Message[..60] + "…" : ex.Message); + ShowOpResult(false, ex.Message); } finally { @@ -329,6 +334,7 @@ _showRestartConfirm = false; _busyRestart = true; _opResultMessage = null; + _opResultMessageFull = null; StateHasChanged(); try { @@ -341,7 +347,7 @@ } catch (Exception ex) { - ShowOpResult(false, ex.Message.Length > 60 ? ex.Message[..60] + "…" : ex.Message); + ShowOpResult(false, ex.Message); } finally { @@ -367,13 +373,17 @@ private void ShowOpResult(bool ok, string message) { _opResultOk = ok; - _opResultMessage = message; + // Single truncation choke point: callers pass the untruncated message, the chip renders the + // abbreviation and carries the original on its title attribute. + _opResultMessageFull = message; + _opResultMessage = DisplayText.Abbreviate(message, 60); // Auto-clear the result chip after 8 s. System.Threading.Timer is used (not // System.Timers.Timer) so DisposeAsync can drain any in-flight callback. _opResultClearTimer?.Dispose(); _opResultClearTimer = new System.Threading.Timer(_ => { _opResultMessage = null; + _opResultMessageFull = null; InvokeAsync(StateHasChanged); }, null, TimeSpan.FromSeconds(8), Timeout.InfiniteTimeSpan); } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverTagPicker.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverTagPicker.razor index a5a26f07..75d8da56 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverTagPicker.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverTagPicker.razor @@ -18,7 +18,7 @@ - @if (_openError is not null) - { -
@_openError
- } @if (_token != Guid.Empty) { @@ -207,7 +205,7 @@ else
TagConfig: - @(_built.Length == 0 ? "—" : _built) + @DisplayText.Abbreviate(_built, 64)
@code { diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/Pickers/TwinCATAddressPickerBody.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/Pickers/TwinCATAddressPickerBody.razor index 22875bdc..5306a27c 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/Pickers/TwinCATAddressPickerBody.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/Pickers/TwinCATAddressPickerBody.razor @@ -61,7 +61,7 @@
Result: - @_built + @DisplayText.Abbreviate(_built, 64)
@code {