style(adminui): btn-groups + prose trim on top-level ops pages

Group related action buttons into btn-group/btn-group-sm on Alerts, Certificates,
ApiKeys and ScriptEdit; promote the RoleGrants Delete from btn-link to
btn-outline-danger. Replace the two inline style="border-color:var(--alert)"
no-ops with the .notice-alert class, and the undefined --surface-2 token in
Scripts with the theme's shipped --zebra-bg.

Delete unconditional documentation prose now covered by docs/ (Redundancy,
Telemetry, AlarmTracking, security, Reservations, AlarmHistorian, ScriptEditor),
keeping state banners and live captions. Correct the LDAP config key on
RoleGrants to Security:Ldap:GroupToRole (LdapOptions.SectionName) and drop the
same wrong key from Account with its deleted block; reword the stale
"Engine emit (F8/F9) is pending" script-log empty state.
This commit is contained in:
Joseph Doherty
2026-08-10 16:32:29 -04:00
parent 4d549571cc
commit 3d6d28e5a2
11 changed files with 60 additions and 109 deletions
@@ -9,19 +9,6 @@
<h4 class="mb-0">OPC UA API keys</h4>
</div>
<div class="alert alert-info" role="alert">
The OPC UA data plane is machine-to-machine. A client connects with an OPC UA
<strong>UserName</strong> token whose username is the literal <span class="mono">apikey</span> and
whose password is the key below. The key resolves to a <strong>principal</strong>; ACL rows naming
that principal are what grant it permissions.
<br />
<strong>Revocation is not uniform across the fleet.</strong> A node with a config database (a fused
admin+driver node such as this one) applies it <em>immediately</em>, because it reads keys per
request. A <strong>driver-only</strong> node has no config database, so its keys travel inside the
deployment artifact and a revocation reaches it only on the <strong>next deployment</strong>.
Assume the slower behaviour when revoking a compromised key.
</div>
@if (_created is not null)
{
<div class="alert alert-success" role="alert">
@@ -111,12 +98,14 @@
<td>@k.CreatedUtc.ToString("yyyy-MM-dd HH:mm")</td>
<td>@(k.ExpiresUtc?.ToString("yyyy-MM-dd") ?? "—")</td>
<td class="text-end">
<button class="btn btn-sm btn-outline-secondary"
@onclick="() => SetEnabledAsync(k.ApiKeyId, !k.Enabled)" disabled="@_busy">
@(k.Enabled ? "Revoke" : "Re-enable")
</button>
<button class="btn btn-sm btn-outline-danger"
@onclick="() => DeleteAsync(k.ApiKeyId)" disabled="@_busy">Delete</button>
<div class="btn-group btn-group-sm" role="group">
<button class="btn btn-sm btn-outline-secondary"
@onclick="() => SetEnabledAsync(k.ApiKeyId, !k.Enabled)" disabled="@_busy">
@(k.Enabled ? "Revoke" : "Re-enable")
</button>
<button class="btn btn-sm btn-outline-danger"
@onclick="() => DeleteAsync(k.ApiKeyId)" disabled="@_busy">Delete</button>
</div>
</td>
</tr>
}