- Each Admin role grants a fixed capability set per admin-ui.md §Admin Roles. - Pages below reflect what this session can access; the route's [Authorize] guard - is the ground truth — this table mirrors it for readability. This table covers - fleet-wide capabilities only — a cluster-scoped grant unlocks the same actions inside its - named cluster without satisfying these fleet-wide policies. -
-| Capability | -Required role(s) | -You have it? | -
|---|---|---|
| @cap.Name @cap.Description |
- @string.Join(" or ", cap.RequiredRoles) | -- @if (has) - { - Yes - } - else - { - No - } - | -
Local store-and-forward queue that ships alarm events to Aveva Historian via Galaxy.Host.
- -No rejected certificates. Clients that fail to handshake with an untrusted cert land here.
- } - else - { -| Subject | Issuer | Thumbprint | Valid | Actions |
|---|---|---|---|---|
| @c.Subject | -@c.Issuer | -@c.Thumbprint | -@c.NotBefore.ToString("yyyy-MM-dd") → @c.NotAfter.ToString("yyyy-MM-dd") | -- - - | -
No client certs have been explicitly trusted. The server's own application cert lives in own/ and is not listed here.
- } - else - { -| Subject | Issuer | Thumbprint | Valid | Actions |
|---|---|---|---|---|
| @c.Subject | -@c.Issuer | -@c.Thumbprint | -@c.NotBefore.ToString("yyyy-MM-dd") → @c.NotAfter.ToString("yyyy-MM-dd") | -- - | -
Loading…
} -else if (_acls.Count == 0) {No ACL grants in this draft. Publish will result in a cluster with no external access.
} -else -{ -| LDAP group | Scope | Scope ID | Permissions | |
|---|---|---|---|---|
| @a.LdapGroup | -@a.ScopeKind | -@(a.ScopeId ?? "-") | -@a.PermissionFlags | -- |
| LDAP group matched | Level | Flags contributed |
|---|---|---|
| @m.LdapGroup | -@m.Scope | -@m.PermissionFlags | -
Loading…
} -else if (_entries.Count == 0) {No audit entries for this cluster yet.
} -else -{ -| When | Principal | Event | Node | Generation | Details |
|---|---|---|---|---|---|
| @a.Timestamp.ToString("u") | -@a.Principal | -@a.EventType | -@a.NodeId | -@a.GenerationId | -@a.DetailsJson | -
Loading…
-} -else if (!_canView) -{ -Loading…
-} -else if (_clusters.Count == 0) -{ -No clusters yet. Create the first one.
-} -else -{ -| ClusterId | Name | Enterprise | Site | -RedundancyMode | NodeCount | Enabled | - |
|---|---|---|---|---|---|---|---|
| @c.ClusterId | -@c.Name | -@c.Enterprise | -@c.Site | -@c.RedundancyMode | -@c.NodeCount | -- @if (c.Enabled) { Active } - else { Disabled } - | -Open | -
No changes in this section.
- } - else - { - @if (_total > RowCap) - { -| LogicalId | Change |
|---|---|
| @r.LogicalId | -- @switch (r.ChangeKind) - { - case "Added": @r.ChangeKind break; - case "Removed": @r.ChangeKind break; - case "Modified": @r.ChangeKind break; - default: @r.ChangeKind break; - } - | -
Computing diff…
-} -else if (_error is not null) -{ -No differences — draft is structurally identical to the last published generation.
-} -else -{ -- @_rows.Count row@(_rows.Count == 1 ? "" : "s") across @_sectionsWithChanges of @Sections.Count sections. - Each section is capped at @DiffSection.DefaultRowCap rows to keep the browser responsive on pathological drafts. -
- - @foreach (var sec in Sections) - { -Checking…
} - else if (_errors.Count == 0) {No validation errors — safe to publish.
} - else - { -@_errors.Count error@(_errors.Count == 1 ? "" : "s")
-Loading…
} -else if (_drivers.Count == 0) {No drivers configured in this draft.
} -else -{ -| DriverInstanceId | Name | Type | Namespace |
|---|---|---|---|
| @d.DriverInstanceId | -@d.Name | -- @if (string.Equals(d.DriverType, "Focas", StringComparison.OrdinalIgnoreCase)) - { - @d.DriverType - } - else - { - @d.DriverType - } - | -@d.NamespaceId | -