refactor(ui): unify semantic presentation and table hierarchy

This commit is contained in:
Joseph Doherty
2026-11-13 19:06:18 -05:00
parent 2d30323ae8
commit 0c41b613ac
97 changed files with 13829 additions and 167 deletions
@@ -89,3 +89,29 @@ The native after proof uses actual segmented keyboard entry, not programmatic in
Dashboard initial reads alone were sequential, but an early Retry could overlap the next repository read. All initial/retry operations now share a component-owned async gate. The renderer claims each fact's pending state before its first await, coalescing duplicate target requests. A deterministic delayed-Connections/early-Sites-retry regression reproduces the prior3 Sites invocations before Connections completed (expected1); final code waits and makes exactly one recovery read. Counts remain independent, and successful facts are not reloaded. The first async test attempt had CS4014 in NSubstitute verification; compile output is preserved separately, then meaningful red/green evidence follows.
Reviewed full Release suite1576/1576 passed, zero skips/failures (reviewed-full-suite.log/sb04-06-reviewed.trx). The only following production change was omitting the false ARIA override; final focused31/31 and final20 audit cases in each of UTC/Indianapolis/Tokyo pass. Native Chromium focused after proof passes including AX invalid=true. These correction checks are narrow technical regressions, not another broad screenshot/polish round. No batch commit or SB07+ expansion until parent accepts the corrected frozen source.
## SB07–09 review batch
SB07 replaces flow/status text foregrounds with the published semantic ink/deep-accent tokens; status signal borders/dots/backgrounds remain unchanged. The supported-dark palette already owned by actual site.css is retained. Local Bootstrap text utilities now bridge to those same shared ink tokens, including muted/secondary text. No new color/font literals or independent palette. A scoped trace-row rule previously suppressed keyboard outline; removing that suppression exposes the shared2px focus recipe. Before actual computed pairs include light warning1.48:1/info1.78:1 and dark success/danger about3.73:1; before keyboard trace outline was0px. The retained before JSON/calculation records exact sampled pairs, not a source-only contrast guess.
SB08 adopts shared page-head/h1 anatomy across44 page components/57 route declarations. Login continues to render the shared LoginCard h1; no local login theme fork. Topology title remains present while loading/failed, and Template detail has mutually exclusive placeholder/loaded titles. Existing title copy/state expressions are preserved except adding the missing LDAP/Site page titles and a subordinate Site details section label. Compact20px published heading scale is measured in actual dashboard/SMS/SMTP samples. Infrequent topology Area/expand/collapse/recheck actions use one native More actions disclosure; Instance/Refresh/search/Live updates remain visible, with existing handler/disabled/policy expressions preserved.
All33 manual page tables in19 files have one named keyboard-scrollable local container, reusing existing responsive/overflow ancestors rather than double wrapping. Repeated Health/connection/instance/template/import groups use contextual names. Forced light/dark thead classes are removed so shared scheme tokens own both modes; shared1.0.1 semantic row headers remain static/title case. Existing columns, row loops, actions, role checks and data bindings are retained. binding-preservation.json mechanically compares the exact event/bind/policy expression multisets across modified page source, all unchanged; source review and existing tests remain the behavioral evidence.
SB09 shared DataTable now emits exactly0 items for empty/filter-empty state and restores its existing count/paging range after Clear. An optional TableLabel defaults safely to Data table and updates its named keyboard overflow region. No production page currently calls this reusable component; the33 manual page table adaptations above are separate, not falsely attributed to DataTable.
Six new heading/table regressions failed as intended (red-heading-table.log). Topology now asserts one h1 in loading/loaded/error; table cases cover true empty, filter-empty/Clear and named keyboard region. Existing behavior-focused full suite1582/1582 passes with zero skips/failures (final-full-suite.log/sb07-09-final.trx). The subsequent optional TableLabel update assertion passes with final heading/table focused tests; only the scoped graph text-opacity correction below followed that full run. Scoped CSS uses actual computed/browser validation, not declaration-mirroring tests.
Actual after matrix20/20 passes in browser/results.json: flow/list/table light/dark at1440/1024/390 and actual200% browser zoom (720 CSS pixels/DPR2), plus real dashboard/SMS/SMTP component samples in both schemes at desktop/mobile. All sampled state/utility text contrast is at least4.544:1; keyboard trace focus is solid2px in the family focus color; data table scroll accepts keyboard input, empty filtering/Clear is correct, row-header computed position/static and textTransform/none are retained, and each sample has one page h1. No document overflow or browser errors. Screenshots were captured in one after inspection batch and inspected at mobile/dark and desktop/light; a subsequent focused normal-motion/ghost opacity correction is documented below; no additional broad polish round was performed. The baseline used ScriptRun graph samples; the after fixture adds outbound-kind samples to exercise the real graph status-pill branch as well as the trace.
These are actual components with synthetic data/read-only fixture adapters, not full authenticated deployment route captures. Topology loaded-tree geometry/touch and health operational-state ordering are still owned by later SB11/SB12; full-route integration remains SB00/SB15 acceptance work. Original G1 proof unchanged. Frozen source is source-freeze.json. No SB10+ source changes or commit before this batch review.
### Focused unbroken-identifier negative case
The broad presentation fixture initially used a hyphenated value that could wrap, so it did not establish actual horizontal overflow. A separate focused fixture-only221-character unbroken reference now proves the actual DataTable scroll region at390 and real200% zoom in both schemes: scrollWidth1989px, region350/680px, native ArrowRight moves scrollLeft, focus stays on the named region, full text length221 remains present, and document width stays390/720. Font is the shared IBM Plex Mono. focused-table-overflow.json retains all four cases. No production UI correction or extra broad screenshot round was performed for this additional negative condition.
### Normal-motion and predicted-ghost text opacity
The reduced-motion matrix alone did not cover two existing opacity paths: pending pills faded to0.6 mid-animation, and predicted ghost groups faded all labels to0.45. Focused actual before proof is pending-motion-before.json and ghost-opacity-before.json (the fixture now supplies a real PredictedFlow overlay). The decorative pending fade is removed; ghost text stays opaque while its existing dashed shape/tinted fill still conveys prediction. No state mapping, edge math, poll or callback change.
Focused after proof covers light/dark × normal/reduced motion, four cases: pending opacity1/no animation, ghost group opacity1, and actual title/caption/pill text contrast at least4.5:1. The SVG ghost-background calculation composites its actual fill opacity over the actual alternate lane and wrap surfaces, rather than ignoring ancestor opacity. Existing FlowGraph/FlowDebugger/FlowTrace semantics118/118 tests pass (flow-opacity-focused.log). This is a narrow readability correction after the reduced-motion matrix, not a third broad screenshot review. Last full functional baseline remains1582/1582 with only these CSS opacity changes following it.
@@ -0,0 +1,204 @@
[
{
"scheme": "light",
"pairs": [
{
"text": "Successful sample",
"class": "text-success",
"color": "rgb(25, 135, 84)",
"background": "rgb(244, 244, 241)",
"contrast": 4.112
},
{
"text": "Warning sample",
"class": "text-warning",
"color": "rgb(255, 193, 7)",
"background": "rgb(244, 244, 241)",
"contrast": 1.479
},
{
"text": "Failure sample",
"class": "text-danger",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)",
"contrast": 4.109
},
{
"text": "Information sample",
"class": "text-info",
"color": "rgb(13, 202, 240)",
"background": "rgb(244, 244, 241)",
"contrast": 1.777
},
{
"text": "Muted sample",
"class": "text-muted",
"color": "rgba(33, 37, 41, 0.75)",
"background": "rgb(244, 244, 241)",
"contrast": 6.427
},
{
"text": "Secondary sample",
"class": "text-secondary",
"color": "rgb(108, 117, 125)",
"background": "rgb(244, 244, 241)",
"contrast": 4.255
},
{
"text": "Ok",
"class": "ft-pill ok",
"color": "rgb(25, 135, 84)",
"background": "rgb(244, 244, 241)",
"contrast": 4.112
},
{
"text": "Failed",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)",
"contrast": 4.109
},
{
"text": "Timed out",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)",
"contrast": 4.109
},
{
"text": "Predicted",
"class": "ft-pill",
"color": "rgb(27, 29, 33)",
"background": "rgb(244, 244, 241)",
"contrast": 15.315
},
{
"text": "Not traced",
"class": "ft-pill",
"color": "rgb(27, 29, 33)",
"background": "rgb(244, 244, 241)",
"contrast": 15.315
},
{
"text": "Pending",
"class": "ft-pill pending",
"color": "rgb(47, 95, 208)",
"background": "rgb(244, 244, 241)",
"contrast": 5.195
},
{
"text": "Parked",
"class": "ft-pill parked",
"color": "rgb(232, 146, 12)",
"background": "rgb(244, 244, 241)",
"contrast": 2.229
}
],
"focus": {
"active": true,
"visible": true,
"outline": "rgb(27, 29, 33) none 0px"
}
},
{
"scheme": "dark",
"pairs": [
{
"text": "Successful sample",
"class": "text-success",
"color": "rgb(25, 135, 84)",
"background": "rgb(27, 29, 33)",
"contrast": 3.725
},
{
"text": "Warning sample",
"class": "text-warning",
"color": "rgb(255, 193, 7)",
"background": "rgb(27, 29, 33)",
"contrast": 10.354
},
{
"text": "Failure sample",
"class": "text-danger",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)",
"contrast": 3.728
},
{
"text": "Information sample",
"class": "text-info",
"color": "rgb(13, 202, 240)",
"background": "rgb(27, 29, 33)",
"contrast": 8.618
},
{
"text": "Muted sample",
"class": "text-muted",
"color": "rgba(222, 226, 230, 0.75)",
"background": "rgb(27, 29, 33)",
"contrast": 7.809
},
{
"text": "Secondary sample",
"class": "text-secondary",
"color": "rgb(108, 117, 125)",
"background": "rgb(27, 29, 33)",
"contrast": 3.599
},
{
"text": "Ok",
"class": "ft-pill ok",
"color": "rgb(25, 135, 84)",
"background": "rgb(27, 29, 33)",
"contrast": 3.725
},
{
"text": "Failed",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)",
"contrast": 3.728
},
{
"text": "Timed out",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)",
"contrast": 3.728
},
{
"text": "Predicted",
"class": "ft-pill",
"color": "rgb(230, 232, 236)",
"background": "rgb(27, 29, 33)",
"contrast": 13.757
},
{
"text": "Not traced",
"class": "ft-pill",
"color": "rgb(230, 232, 236)",
"background": "rgb(27, 29, 33)",
"contrast": 13.757
},
{
"text": "Pending",
"class": "ft-pill pending",
"color": "rgb(122, 160, 239)",
"background": "rgb(27, 29, 33)",
"contrast": 6.511
},
{
"text": "Parked",
"class": "ft-pill parked",
"color": "rgb(240, 160, 48)",
"background": "rgb(27, 29, 33)",
"contrast": 7.857
}
],
"focus": {
"active": true,
"visible": true,
"outline": "rgb(230, 232, 236) none 0px"
}
}
]
@@ -0,0 +1,260 @@
[
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
"policyAttributesUnchanged": true,
"eventBindingsUnchanged": true,
"bindExpressionsUnchanged": true
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@@ -0,0 +1,25 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 161, Skipped: 0, Total: 161, Duration: 1 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,26 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb07-09/sb07-09-final.trx
Passed! - Failed: 0, Passed: 1582, Skipped: 0, Total: 1582, Duration: 34 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,25 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 44, Skipped: 0, Total: 44, Duration: 386 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,233 @@
[
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 235,
"regionMarkup": "<div class=\"table-responsive\" style=\"max-height: 480px; overflow-y: auto;\" role=\"region\" aria-label=\"Bundle contents\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 350,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Import site mappings\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 403,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Import connection mappings for {grp.Key}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 493,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@title\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 683,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Template attributes\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 913,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Template alarms\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 996,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Native alarm sources\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 1166,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Template scripts\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
"line": 48,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Connection Certificates records\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
"line": 80,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Schema library\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"line": 45,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"LDAP group mappings\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"line": 46,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"API keys\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"line": 125,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Secured write requests\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"line": 195,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Secured write requests\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
"line": 88,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Configuration audit log\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
"line": 122,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Deployment status\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 213,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Binding group {g.Key}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 351,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Attribute overrides\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 441,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Alarm overrides\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 653,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Native alarm source overrides\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
"line": 164,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Parked messages\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
"line": 181,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Alarm summary\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 364,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Nodes for {siteName}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 450,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Tag quality for {connName} at {siteName}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 491,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Instances for {siteName}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 546,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"@($\"Error counts for {siteName}\")\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
"line": 102,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Site event log results\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
"line": 147,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Site call results\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"line": 92,
"regionMarkup": "<div class=\"table-responsive mb-3\" role=\"region\" aria-label=\"Notification per-node breakdown\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"line": 137,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Notification per-site breakdown\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
"line": 48,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Notification lists\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
"line": 96,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Notification recipients\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
"line": 146,
"regionMarkup": "<div class=\"table-responsive\" role=\"region\" aria-label=\"Notification report results\" tabindex=\"0\">",
"namedRegion": true,
"oneLocalScrollContainer": true
}
]
@@ -0,0 +1,455 @@
[
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Login.razor",
"routes": [
"/login"
],
"directH1Count": 0,
"sharedLoginCardHeading": true,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
"routes": [
"/"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
"routes": [
"/design/api-methods/create",
"/design/api-methods/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
"routes": [
"/design/external-systems/create",
"/design/external-systems/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"routes": [
"/design/transport/import"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
"routes": [
"/design/shared-scripts"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"routes": [
"/design/templates/{Id:int}"
],
"directH1Count": 2,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": true,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
"routes": [
"/design/connections/{Id:int}/certificates"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
"routes": [
"/design/connections",
"/design/data-connections"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
"routes": [
"/design/db-connections/create",
"/design/db-connections/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
"routes": [
"/design/connections/create",
"/design/connections/{Id:int}/edit",
"/design/data-connections/create",
"/design/data-connections/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
"routes": [
"/design/templates"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
"routes": [
"/design/external-systems"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
"routes": [
"/design/templates/create"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
"routes": [
"/design/schema-library"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
"routes": [
"/design/shared-scripts/create",
"/design/shared-scripts/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
"routes": [
"/design/transport/export"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
"routes": [
"/admin/sites"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
"routes": [
"/admin/api-keys/create",
"/admin/api-keys/{KeyId}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"routes": [
"/admin/ldap-mappings"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
"routes": [
"/admin/ldap-mappings/create",
"/admin/ldap-mappings/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
"routes": [
"/admin/sites/create",
"/admin/sites/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"routes": [
"/admin/api-keys"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"routes": [
"/operations/secured-writes"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
"routes": [
"/audit/configuration"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
"routes": [
"/audit/execution-tree"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
"routes": [
"/audit/log"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor",
"routes": [
"/deployment/topology",
"/deployment/instances"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
"routes": [
"/deployment/deployments"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
"routes": [
"/deployment/instances/create"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"routes": [
"/deployment/instances/{Id:int}/configure"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
"routes": [
"/deployment/flow-debugger"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
"routes": [
"/deployment/debug-view"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
"routes": [
"/monitoring/parked-messages"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
"routes": [
"/monitoring/alarms"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"routes": [
"/monitoring/health"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
"routes": [
"/monitoring/event-logs"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
"routes": [
"/site-calls/report"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
"routes": [
"/notifications/sms"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
"routes": [
"/notifications/smtp"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"routes": [
"/notifications/kpis"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
"routes": [
"/notifications/lists"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
"routes": [
"/notifications/lists/create",
"/notifications/lists/{Id:int}/edit"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
"routes": [
"/notifications/report"
],
"directH1Count": 1,
"sharedLoginCardHeading": false,
"conditionalHeadingBranches": false,
"forcedLightOrDarkThead": false
}
]
@@ -0,0 +1,25 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 118, Skipped: 0, Total: 118, Duration: 773 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,125 @@
{
"results": [
{
"pending": {
"opacity": "1",
"animations": 0,
"color": "rgb(133, 80, 0)",
"background": "rgb(253, 241, 221)",
"contrast": 5.979
},
"ghost": {
"opacity": "1",
"titleColor": "rgb(27, 29, 33)",
"captionColor": "rgb(98, 105, 112)",
"boxFill": "rgb(228, 228, 223)",
"boxFillOpacity": "0.35",
"strokeDasharray": "4px, 3px",
"laneFill": "rgb(228, 228, 223)",
"laneFillOpacity": "0.25",
"wrapBackground": "rgb(244, 244, 241)",
"effectiveBackground": [
235.8,
235.8,
231.77499999999998
],
"titleContrast": 14.223,
"captionContrast": 4.689
},
"scheme": "light",
"motion": "no-preference",
"passed": true
},
{
"pending": {
"opacity": "1",
"animations": 0,
"color": "rgb(133, 80, 0)",
"background": "rgb(253, 241, 221)",
"contrast": 5.979
},
"ghost": {
"opacity": "1",
"titleColor": "rgb(27, 29, 33)",
"captionColor": "rgb(98, 105, 112)",
"boxFill": "rgb(228, 228, 223)",
"boxFillOpacity": "0.35",
"strokeDasharray": "4px, 3px",
"laneFill": "rgb(228, 228, 223)",
"laneFillOpacity": "0.25",
"wrapBackground": "rgb(244, 244, 241)",
"effectiveBackground": [
235.8,
235.8,
231.77499999999998
],
"titleContrast": 14.223,
"captionContrast": 4.689
},
"scheme": "light",
"motion": "reduce",
"passed": true
},
{
"pending": {
"opacity": "1",
"animations": 0,
"color": "rgb(239, 189, 99)",
"background": "rgb(46, 34, 16)",
"contrast": 8.968
},
"ghost": {
"opacity": "1",
"titleColor": "rgb(230, 232, 236)",
"captionColor": "rgb(168, 176, 188)",
"boxFill": "rgb(51, 55, 62)",
"boxFillOpacity": "0.35",
"strokeDasharray": "4px, 3px",
"laneFill": "rgb(51, 55, 62)",
"laneFillOpacity": "0.25",
"wrapBackground": "rgb(27, 29, 33)",
"effectiveBackground": [
39.3,
42.325,
47.8625
],
"titleContrast": 11.679,
"captionContrast": 6.551
},
"scheme": "dark",
"motion": "no-preference",
"passed": true
},
{
"pending": {
"opacity": "1",
"animations": 0,
"color": "rgb(239, 189, 99)",
"background": "rgb(46, 34, 16)",
"contrast": 8.968
},
"ghost": {
"opacity": "1",
"titleColor": "rgb(230, 232, 236)",
"captionColor": "rgb(168, 176, 188)",
"boxFill": "rgb(51, 55, 62)",
"boxFillOpacity": "0.35",
"strokeDasharray": "4px, 3px",
"laneFill": "rgb(51, 55, 62)",
"laneFillOpacity": "0.25",
"wrapBackground": "rgb(27, 29, 33)",
"effectiveBackground": [
39.3,
42.325,
47.8625
],
"titleContrast": 11.679,
"captionContrast": 6.551
},
"scheme": "dark",
"motion": "reduce",
"passed": true
}
],
"passed": true
}
@@ -0,0 +1,65 @@
{
"results": [
{
"width": 350,
"scrollWidth": 1989,
"scrollLeft": 25,
"focused": true,
"payloadLength": 221,
"font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
"innerWidth": 390,
"documentScrollWidth": 390,
"DPR": 1,
"scheme": "light",
"physicalWidth": 390,
"zoom": 1,
"passed": true
},
{
"width": 350,
"scrollWidth": 1989,
"scrollLeft": 1,
"focused": true,
"payloadLength": 221,
"font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
"innerWidth": 390,
"documentScrollWidth": 390,
"DPR": 1,
"scheme": "dark",
"physicalWidth": 390,
"zoom": 1,
"passed": true
},
{
"width": 680,
"scrollWidth": 1989,
"scrollLeft": 19.5,
"focused": true,
"payloadLength": 221,
"font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
"innerWidth": 720,
"documentScrollWidth": 720,
"DPR": 2,
"scheme": "light",
"physicalWidth": 1440,
"zoom": 2,
"passed": true
},
{
"width": 680,
"scrollWidth": 1989,
"scrollLeft": 5,
"focused": true,
"payloadLength": 221,
"font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
"innerWidth": 720,
"documentScrollWidth": 720,
"DPR": 2,
"scheme": "dark",
"physicalWidth": 1440,
"zoom": 2,
"passed": true
}
],
"passed": true
}
@@ -0,0 +1,26 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb07-09/sb07-09.trx
Passed! - Failed: 0, Passed: 1582, Skipped: 0, Total: 1582, Duration: 33 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,7 @@
{
"opacity": "0.45",
"text": "SCRIPT RUN\n predicted\n Synthetic predicted-only branch\n Not observed in this synthetic run",
"boxFill": "rgb(228, 228, 223)",
"boxFillOpacity": "0.35",
"titleColor": "rgb(27, 29, 33)"
}
@@ -0,0 +1,25 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 99, Skipped: 0, Total: 99, Duration: 857 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,200 @@
[
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 235,
"label": "Bundle import preview",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 349,
"label": "Bundle import preview",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"line": 400,
"label": "Bundle import preview",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 492,
"label": "Template definitions",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 680,
"label": "Template definitions",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 908,
"label": "Template definitions",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 989,
"label": "Template definitions",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"line": 1157,
"label": "Template definitions",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
"line": 47,
"label": "Connection Certificates records",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
"line": 79,
"label": "Schema library",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"line": 44,
"label": "LDAP group mappings",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"line": 45,
"label": "API keys",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"line": 124,
"label": "Secured write requests",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"line": 192,
"label": "Secured write requests",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
"line": 87,
"label": "Configuration audit log",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
"line": 121,
"label": "Deployment status",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 213,
"label": "Instance configuration",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 350,
"label": "Instance configuration",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 438,
"label": "Instance configuration",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"line": 648,
"label": "Instance configuration",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
"line": 164,
"label": "Parked messages",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
"line": 181,
"label": "Alarm summary",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 363,
"label": "Health details",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 447,
"label": "Health details",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 486,
"label": "Health details",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"line": 539,
"label": "Health details",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
"line": 101,
"label": "Site event log results",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
"line": 147,
"label": "Site call results",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"line": 92,
"label": "Notification KPIs",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"line": 137,
"label": "Notification KPIs",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
"line": 48,
"label": "Notification lists",
"action": "reuse existing scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
"line": 95,
"label": "Notification recipients",
"action": "add local scroll container"
},
{
"file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
"line": 146,
"label": "Notification report results",
"action": "reuse existing scroll container"
}
]
@@ -0,0 +1,42 @@
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor"
]
@@ -0,0 +1,7 @@
{
"opacity": "0.6",
"color": "rgb(133, 80, 0)",
"background": "rgb(253, 241, 221)",
"animationName": "fg-pulse-b-vd16xyvy19",
"reduced": false
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

@@ -0,0 +1,178 @@
[
{
"scheme": "light",
"pairs": [
{
"text": "Successful sample",
"class": "text-success",
"color": "rgb(25, 135, 84)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Warning sample",
"class": "text-warning",
"color": "rgb(255, 193, 7)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Failure sample",
"class": "text-danger",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Information sample",
"class": "text-info",
"color": "rgb(13, 202, 240)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Muted sample",
"class": "text-muted",
"color": "rgba(33, 37, 41, 0.75)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Secondary sample",
"class": "text-secondary",
"color": "rgb(108, 117, 125)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Ok",
"class": "ft-pill ok",
"color": "rgb(25, 135, 84)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Failed",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Timed out",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Predicted",
"class": "ft-pill",
"color": "rgb(27, 29, 33)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Not traced",
"class": "ft-pill",
"color": "rgb(27, 29, 33)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Pending",
"class": "ft-pill pending",
"color": "rgb(47, 95, 208)",
"background": "rgb(244, 244, 241)"
},
{
"text": "Parked",
"class": "ft-pill parked",
"color": "rgb(232, 146, 12)",
"background": "rgb(244, 244, 241)"
}
],
"focus": {
"active": true,
"visible": true,
"outline": "rgb(27, 29, 33) none 0px"
}
},
{
"scheme": "dark",
"pairs": [
{
"text": "Successful sample",
"class": "text-success",
"color": "rgb(25, 135, 84)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Warning sample",
"class": "text-warning",
"color": "rgb(255, 193, 7)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Failure sample",
"class": "text-danger",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Information sample",
"class": "text-info",
"color": "rgb(13, 202, 240)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Muted sample",
"class": "text-muted",
"color": "rgba(222, 226, 230, 0.75)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Secondary sample",
"class": "text-secondary",
"color": "rgb(108, 117, 125)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Ok",
"class": "ft-pill ok",
"color": "rgb(25, 135, 84)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Failed",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Timed out",
"class": "ft-pill failed",
"color": "rgb(220, 53, 69)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Predicted",
"class": "ft-pill",
"color": "rgb(230, 232, 236)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Not traced",
"class": "ft-pill",
"color": "rgb(230, 232, 236)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Pending",
"class": "ft-pill pending",
"color": "rgb(122, 160, 239)",
"background": "rgb(27, 29, 33)"
},
{
"text": "Parked",
"class": "ft-pill parked",
"color": "rgb(240, 160, 48)",
"background": "rgb(27, 29, 33)"
}
],
"focus": {
"active": true,
"visible": true,
"outline": "rgb(230, 232, 236) none 0px"
}
}
]
@@ -0,0 +1,83 @@
ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.31] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "error") [FAIL]
[xUnit.net 00:00:00.32] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion [FAIL]
[xUnit.net 00:00:00.34] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loaded") [FAIL]
[xUnit.net 00:00:00.34] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loading") [FAIL]
[xUnit.net 00:00:00.35] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount [FAIL]
[xUnit.net 00:00:00.35] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "error") [156 ms]
Error Message:
Assert.Single() Failure: The collection was empty
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
--- End of stack trace from previous location ---
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion [154 ms]
Error Message:
Bunit.ElementNotFoundException : No elements were found that matches the selector '[role=region]'
Stack Trace:
at Bunit.RenderedComponentExtensions.Find[TComponent,TElement](IRenderedComponent`1 renderedComponent, String cssSelector) in /_/src/bunit/Extensions/RenderedComponentExtensions.cs:line 42
at Bunit.RenderedComponentExtensions.Find[TComponent](IRenderedComponent`1 renderedComponent, String cssSelector) in /_/src/bunit/Extensions/RenderedComponentExtensions.cs:line 21
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 51
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loaded") [15 ms]
Error Message:
Assert.Single() Failure: The collection was empty
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
--- End of stack trace from previous location ---
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loading") [4 ms]
Error Message:
Assert.Single() Failure: The collection was empty
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
--- End of stack trace from previous location ---
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount [33 ms]
Error Message:
Assert.Equal() Failure: Strings differ
↓ (pos 0)
Expected: "0 items"
Actual: "Showing 1–0 of 0 items"
↑ (pos 0)
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 41
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems [< 1 ms]
Error Message:
Assert.Equal() Failure: Strings differ
↓ (pos 0)
Expected: "0 items"
Actual: "Showing 1–0 of 0 items"
↑ (pos 0)
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 31
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed! - Failed: 6, Passed: 0, Skipped: 0, Total: 6, Duration: 197 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,55 @@
{
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor": "7e08c7bf2ac55a307e5a0621124954a9c80464b32bec455087c72a47c3860ec1",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor": "6b253b9fe82c162f5e3933178690ecb1c62b766da61211411737214e2a31509b",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor": "7de28db08f9504656cc5f3116fb4ad50b04921a0cf1813d61134b621741d2209",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor": "634e511f9950fae16ca7c135a9fc2525b70dea642eeeb9d8eee006e659bba378",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor": "a51a6d4d78819b204dbb6df32d7f674d4ee192a16a2fa1c44f3d1443b4c01758",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor": "8a836b5b0901c3573c248c8f5c12697ff29c8948ee009b694d2f1b0cc1168fff",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor": "67a62d4e990e1ae70244b2d3146f2db340d3fc8e5ea77d75cbb87903edd89e59",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor": "ab4a75ec947b28bff820cdf209630fe8ca08d52f7c1ea2e5b91310f55ded74b1",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor": "26b5cd0daa9fab103634b9689dd4c8000cd6710fcd31aefebc2f0b7fb843fb6a",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor": "b0e07766b1a0cda9da2a51823913cff7f05689b52ad39b8021b06bf6a4c2234c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor": "770fb406174ab7178692f7e9838e583fba9e0165c88bbcc2ddc8add02bcc691c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor": "1fd2773341ccf977a80b1c1dc81d7d0de14f36085f700ead8fbf18d4730eb81c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor": "222f29b69dcfa79ed74837d918f041eccc4647b8484e47409b5b166cab4ce3c8",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor.css": "8c2cf0cf6c21115a780219adb6b8733efed8ee3c57df074484935add14e12ee0",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor": "3a64e6b02af931d5cfcad2cf2c8a3f1a533c81494f2452f666e573490feffa4d",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor": "25d610f01bf403b2d115a96e9bc433dce2523af602fbd068c063886c0cbea751",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor": "37eccb6479b1c2a315ac80225d228ee7cd280047fa1be45d97e910f461319aec",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor": "819b7661d5e82d80e084b6bf44efe4c2ed15d2b68156fe4f27b25614dd280f29",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor": "5d2ee928b4baf684399eb3ab8bfc000307541663f1c4c8b378a93fca4dc012e9",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor": "d8b9771cd6ec48b64dffbdba66fa2ddc5f8cf0ab0555425a6678cf3de3f1cfc9",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor": "bb90352b01a23d067b4235b3634f847ad5a8bf4746e97769e8c4b845ad5b80dd",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor": "e6fd865071030824b3beaf6cea5c2b5c2929c82a2cc999361e3a7c55301fe369",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor": "e21a01b362b55bd65fb4e01e44c4ccfe284b44ef03056c66ac94b48d1befb41c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor": "7ea5819b39e282869223183b854c00b5ec1eebc326fd7e0fd8f1179d53dc5f9b",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor": "d3a06cf247a33d19b4bb95619d513bdc92af845e3cf6b244c4fc37898c0917cd",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor": "4a57014983f098bce6df59f0f6a16b59042957656d965733f9cbd2e5b3d5ce6c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor": "66933f0bee3436553eea87f46b08d17c57a166151f344d59029c30d25e36937b",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor": "da7f319b8446aadbc972c2721b169c94e4e28fbe9e5509bed2e6f555875edefd",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor": "61e1e91175c30d60833d4033ae34efec80dea2f8185ba08d4c37f8272a5fc3e0",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor": "2f7d01190a3b2ea7022d3d6d8aa33bc828d8477b3bb0bcdeab666fd7516f241f",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor": "f2231b81339001e198cc275c46b22678f3032adad4ebdc92d9399ff3ba5b2bb4",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor": "a168e80bb1a5dcf1e942a9830e510e12ad5caf6ccdb57741af3a68b4b7e2250f",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor": "7f0f99955244726429d985472d05c523ad0c09af272ff03aa9747b793333fd76",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor": "74e03bd3768e14e57b71e972cb26b617240191b697a78647f07dcd8d440a8af7",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor": "e5b673ddbdda70433358b42db378c3438626244b8355b81baabffedcf6e478e8",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor": "cd4be2b3549f30010c07f41e17a8a09f8453e3c59daeaef7d5e02433977dfcc9",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor": "df5d70d4759591abd5947a97ef09ced33a5347bd79899763530f01ae9b934f5d",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor": "dce2ae3c5cfb488c0e38601910b3c01aaaeb3c50a569851bf7755a509c054a35",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor": "3768242c8e66f5c7ce212d6e77a7522425b73e756a8b27d1208ea9a6b85a3b32",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor": "8a6134e1fd3afd2cd557bd18a14cca6057b86f0f27bf549f6017db2e43bbb8e3",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor": "e349625ebd7b3c876ca72e35853312639b6a4f25b62ab4059cee68c1383273e7",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor": "f03c8025344d8978aa9d3beb5c87b5adc649a16acd036e203321c8349b51e2c0",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor": "9820daef67dce91cc9f94eee7ea37ee8a4f6828a1f5d2ddbcf4f905ee80aa1a0",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor": "1ed888f12a6c61fa839d0b562782fd93d590e82dca31b380c5e0a1040a7ed733",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DataTable.razor": "0089a6b7c20cf18728faa60b52700243abd76a8f97b430a0267055eb0fda7499",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/FlowGraphView.razor.css": "52af8e2873e332cfbdf4993e0c1934370da60f2246dfa527a22807c4decc6e77",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/FlowTraceList.razor.css": "6c69112dffa14a5ed1f54d5a64298df1f3708ec570f0d771ffc8ff814fec9abe",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css": "e40dc7c5fd9ca6139192cd2698909910c9a4e1e0cab0849a8653aaf627835ca2",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs": "68d8f0d89f92bb04c68bdb9dcf2e0a32f8077ce467b54b8608836aa0532841b7",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs": "d9347828d8a9913b7da501377739826d29a7b7479895169332ddfaf160ca6e3c",
"infra/tools/inspect_presentation.py": "55d819077c696ff1708646fd07b661c43a075ceef73faa9ffd70fe7a5532620f",
"infra/tools/test_table_overflow.py": "df0a611a3c3a85e60e6e74c6eaf074c7f08a68c3ba352dbdaf305bdcd5e25fd2",
"infra/tools/test_flow_text_opacity.py": "1ba2dace2b2ac87fce8aa38d545d5ee459eac0772a4776653c8f83a853bbe94d"
}
+42
View File
@@ -0,0 +1,42 @@
"""Bounded actual-component presentation matrix, loopback synthetic values only."""
from pathlib import Path
import json,re,sys
from playwright.sync_api import sync_playwright
sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary')
from browser_zoom import zoom_browser,set_browser_zoom
out=Path('docs/ui-consistency/evidence/sb07-09/browser');out.mkdir(parents=True,exist_ok=True)
def contrast(fg,bg):
def parts(s):return [float(v) for v in re.findall(r'[\d.]+',s)]
def lum(a):
a=[v/255 for v in a[:3]];a=[v/12.92 if v<=.04045 else ((v+.055)/1.055)**2.4 for v in a];return sum(x*y for x,y in zip(a,[.2126,.7152,.0722]))
a,b=parts(fg),parts(bg)
if len(a)==4:a=[a[i]*a[3]+b[i]*(1-a[3]) for i in range(3)]
lo,hi=sorted([lum(a),lum(b)]);return round((hi+.05)/(lo+.05),3)
results=[]
with sync_playwright() as p:
with zoom_browser(p,width=1440,height=1000) as (context,worker):
cases=[('presentation',w,s,1) for w in [1440,1024,390] for s in ['light','dark']]+[('presentation',1440,s,2) for s in ['light','dark']]+[(kind,w,s,1) for kind in ['dashboard','sms','smtp'] for w in [1440,390] for s in ['light','dark']]
for kind,width,scheme,zoom in cases:
page=context.new_page();page.set_viewport_size({'width':width,'height':1000});page.emulate_media(reduced_motion='reduce');errors=[];page.on('pageerror',lambda e:errors.append(str(e)))
route='/presentation' if kind=='presentation' else '/batch-two?sample=dashboard' if kind=='dashboard' else '/form-samples?view='+kind
page.goto('http://127.0.0.1:5201'+route,wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
if kind in ['sms','smtp']:page.get_by_role('button',name='Add '+kind.upper()+' configuration',exact=True).click();page.locator('input[type=password]').wait_for()
record={'kind':kind,'width':width,'scheme':scheme,'zoom':zoom,'checks':{}}
if zoom==2:record['browserZoom']=set_browser_zoom(worker,page,2)
record['layout']=page.evaluate('({innerWidth,scrollWidth:document.documentElement.scrollWidth,DPR:devicePixelRatio})');record['checks']['noDocumentOverflow']=record['layout']['innerWidth']==record['layout']['scrollWidth'];record['checks']['onePageHeading']=page.locator('h1').count()==1
if kind=='presentation':
record['pairs']=page.evaluate('''()=>[...document.querySelectorAll('.fg-pill,.ft-pill,#utility-samples span')].map(e=>{let c=getComputedStyle(e),p=e,bg;while(p){let b=getComputedStyle(p).backgroundColor;if(b!=='rgba(0, 0, 0, 0)'&&b!=='transparent'){bg=b;break;}p=p.parentElement;}return {text:e.textContent.trim(),class:e.className,color:c.color,background:bg};})''')
for pair in record['pairs']:pair['contrast']=contrast(pair['color'],pair['background'])
record['checks']['readableStateAndUtilityText']=all(pair['contrast']>=4.5 for pair in record['pairs'])
page.locator('.ft-row').first.focus();page.keyboard.press('Tab');record['focus']=page.locator('.ft-row').nth(1).evaluate('e=>{let c=getComputedStyle(e);return {active:e===document.activeElement,visible:e.matches(":focus-visible"),outlineWidth:c.outlineWidth,outlineStyle:c.outlineStyle,outlineColor:c.outlineColor}}');record['checks']['traceKeyboardFocus']=record['focus']['active'] and record['focus']['visible'] and record['focus']['outlineWidth']=='2px' and record['focus']['outlineStyle']=='solid'
region=page.get_by_role('region',name='Synthetic records',exact=True);record['table']=region.evaluate('e=>({width:e.clientWidth,scrollWidth:e.scrollWidth,tabindex:e.tabIndex})')
if record['table']['scrollWidth']>record['table']['width']:
region.focus();page.keyboard.press('ArrowRight');page.wait_for_function('document.querySelector("[aria-label=\\"Synthetic records\\"]").scrollLeft>0')
record['checks']['tableKeyboardRegion']=record['table']['tabindex']==0
record['rowHeader']=region.locator('th[scope=row]').first.evaluate('e=>({position:getComputedStyle(e).position,textTransform:getComputedStyle(e).textTransform})');record['checks']['rowHeadersKeepSemantics']=record['rowHeader']=={'position':'static','textTransform':'none'}
search=page.get_by_label('Search',exact=True);search.fill('no-match');page.wait_for_function('document.querySelector(".table-responsive + .text-muted")?.textContent.trim()==="0 items" || [...document.querySelectorAll(".text-muted.small")].some(e=>e.textContent.trim()==="0 items")');record['checks']['emptyCount']=page.get_by_text('0 items',exact=True).count()==1;page.get_by_role('button',name='Clear search',exact=True).click();page.wait_for_function('document.querySelector("[aria-label=\\"Synthetic records\\"] tbody").textContent.includes("Plant A")')
else:record['headingStyle']=page.locator('h1').evaluate('e=>({font:getComputedStyle(e).fontFamily,size:getComputedStyle(e).fontSize})');record['checks']['sharedHeadingScale']=record['headingStyle']['size']=='20px'
record['errors']=errors;record['checks']['noBrowserError']=not errors;page.screenshot(path=str(out/f'{kind}-{scheme}-{width}-zoom{zoom}.png'),full_page=zoom!=2);results.append(record)
if zoom==2:set_browser_zoom(worker,page,1)
page.close()
(out/'results.json').write_text(json.dumps({'results':results,'passed':all(all(r['checks'].values()) for r in results)},indent=2)+'\n');print([(r['kind'],r['width'],r['scheme'],r['zoom'],all(r['checks'].values())) for r in results])
+20
View File
@@ -0,0 +1,20 @@
"""Focused normal/reduced-motion and predicted-ghost text proof; no screenshot loop."""
import json,re
from pathlib import Path
from playwright.sync_api import sync_playwright
def rgb(s):return [float(v) for v in re.findall(r'[\d.]+',s)][:3]
def mix(f,b,a):return [f[i]*a+b[i]*(1-a) for i in range(3)]
def ratio(a,b):
def lum(v):
v=[x/255 for x in v];v=[x/12.92 if x<=.04045 else ((x+.055)/1.055)**2.4 for x in v];return sum(x*y for x,y in zip(v,[.2126,.7152,.0722]))
lo,hi=sorted([lum(a),lum(b)]);return round((hi+.05)/(lo+.05),3)
results=[]
with sync_playwright() as p:
browser=p.chromium.launch(channel='chromium')
for scheme in ['light','dark']:
for motion in ['no-preference','reduce']:
page=browser.new_page(reduced_motion=motion);page.goto('http://127.0.0.1:5201/presentation',wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
record=page.evaluate('''()=>{const p=document.querySelector('.fg-node.pending .fg-pill'),g=document.querySelector('.fg-node.ghost'),r=g.querySelector('.fg-node-box'),lane=document.querySelector('.fg-lane-bg.alt');const pc=getComputedStyle(p),gc=getComputedStyle(g),rc=getComputedStyle(r),lc=getComputedStyle(lane);return {pending:{opacity:pc.opacity,animations:p.getAnimations().length,color:pc.color,background:pc.backgroundColor},ghost:{opacity:gc.opacity,titleColor:getComputedStyle(g.querySelector('.fg-title')).color,captionColor:getComputedStyle(g.querySelector('.fg-eyebrow')).color,boxFill:rc.fill,boxFillOpacity:rc.fillOpacity,strokeDasharray:rc.strokeDasharray,laneFill:lc.fill,laneFillOpacity:lc.fillOpacity,wrapBackground:getComputedStyle(document.querySelector('.fg-wrap')).backgroundColor}};}''');record.update({'scheme':scheme,'motion':motion});ghost=record['ghost'];base=mix(rgb(ghost['laneFill']),rgb(ghost['wrapBackground']),float(ghost['laneFillOpacity']));background=mix(rgb(ghost['boxFill']),base,float(ghost['boxFillOpacity']));ghost['effectiveBackground']=background;ghost['titleContrast']=ratio(rgb(ghost['titleColor']),background);ghost['captionContrast']=ratio(rgb(ghost['captionColor']),background);record['pending']['contrast']=ratio(rgb(record['pending']['color']),rgb(record['pending']['background']));record['passed']=record['pending']['opacity']=='1' and record['pending']['animations']==0 and ghost['opacity']=='1' and min(ghost['titleContrast'],ghost['captionContrast'],record['pending']['contrast'])>=4.5;results.append(record);page.close()
browser.close()
Path('docs/ui-consistency/evidence/sb07-09/flow-text-opacity-after.json').write_text(json.dumps({'results':results,'passed':all(r['passed'] for r in results)},indent=2)+'\n');print([(r['scheme'],r['motion'],r['passed'],r['ghost']['titleContrast'],r['ghost']['captionContrast']) for r in results])
+18
View File
@@ -0,0 +1,18 @@
"""Focused long unbroken identifier case for the actual DataTable region."""
import json,sys
from pathlib import Path
from playwright.sync_api import sync_playwright
sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary')
from browser_zoom import zoom_browser,set_browser_zoom
results=[]
with sync_playwright() as p:
with zoom_browser(p,width=1440,height=1000) as (context,worker):
for width,zoom in [(390,1),(1440,2)]:
for scheme in ['light','dark']:
page=context.new_page();page.set_viewport_size({'width':width,'height':1000});page.emulate_media(reduced_motion='reduce');page.goto('http://127.0.0.1:5201/presentation',wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
if zoom==2:set_browser_zoom(worker,page,2)
region=page.get_by_role('region',name='Synthetic records',exact=True);region.focus();page.keyboard.press('ArrowRight');page.wait_for_function('selector=>document.querySelector(selector).scrollLeft>0',arg='[aria-label="Synthetic records"]')
result=region.evaluate('e=>({width:e.clientWidth,scrollWidth:e.scrollWidth,scrollLeft:e.scrollLeft,focused:e===document.activeElement,payloadLength:e.querySelector("tbody td span").textContent.length,font:getComputedStyle(e.querySelector("tbody td span")).fontFamily})');result.update(page.evaluate('({innerWidth,documentScrollWidth:document.documentElement.scrollWidth,DPR:devicePixelRatio})'));result.update({'scheme':scheme,'physicalWidth':width,'zoom':zoom});result['passed']=result['scrollWidth']>result['width'] and result['scrollLeft']>0 and result['focused'] and result['innerWidth']==result['documentScrollWidth'] and result['payloadLength']==221;results.append(result)
if zoom==2:set_browser_zoom(worker,page,1)
page.close()
Path('docs/ui-consistency/evidence/sb07-09/focused-table-overflow.json').write_text(json.dumps({'results':results,'passed':all(r['passed'] for r in results)},indent=2)+'\n');print(results)
@@ -13,11 +13,11 @@
@inject IJSRuntime JS
<div class="container-fluid mt-3">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<a href="/admin/api-keys" class="btn btn-outline-secondary btn-sm me-2"
aria-label="Back to API Keys">&larr; Back</a>
<span class="text-muted me-2">·</span>
<h4 class="mb-0">
<h1 class="mb-0">
@if (_saved)
{
@:API Key Created
@@ -30,7 +30,7 @@
{
@:Add API Key
}
</h4>
</h1>
@* Drill-in: deep-link into the central Audit Log
pre-filtered to this API key's inbound calls. Inbound audit rows record
the key Name as Actor and live on the ApiInbound channel. *@
@@ -9,8 +9,8 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">API Key Management</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">API Key Management</h1>
<button class="btn btn-primary btn-sm" @onclick='() => NavigationManager.NavigateTo("/admin/api-keys/create")'>Add API Key</button>
</div>
@@ -42,8 +42,9 @@
}
else
{
<table class="table table-sm table-striped table-hover">
<thead class="table-dark">
<div class="table-responsive" role="region" aria-label="API keys" tabindex="0">
<table class="table table-sm table-striped table-hover">
<thead>
<tr>
<th>Key ID</th>
<th>Name</th>
@@ -99,6 +100,7 @@
}
</tbody>
</table>
</div>
}
}
</div>
@@ -14,6 +14,7 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="page-head"><h1>@(Id.HasValue ? "Edit LDAP Mapping" : "Add LDAP Mapping")</h1></div>
<div class="mb-3">
<button class="btn btn-outline-secondary btn-sm"
aria-label="Back to LDAP mappings"
@@ -24,7 +25,7 @@
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title">Mapping</h5>
<h2 class="h6 card-title">Mapping</h2>
<div class="mb-2">
<label class="form-label small" for="@($"{_fieldScope}-field-1")">LDAP Group Name</label>
<input id="@($"{_fieldScope}-field-1")" type="text" class="form-control form-control-sm" @bind="_formGroupName" />
@@ -10,8 +10,8 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">LDAP Group Mappings</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">LDAP Group Mappings</h1>
<button class="btn btn-primary btn-sm" @onclick='() => NavigationManager.NavigateTo("/admin/ldap-mappings/create")'>Add Mapping</button>
</div>
@@ -41,8 +41,9 @@
}
else
{
<table class="table table-sm table-striped table-hover">
<thead class="table-dark">
<div class="table-responsive" role="region" aria-label="LDAP group mappings" tabindex="0">
<table class="table table-sm table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>LDAP Group Name</th>
@@ -95,6 +96,7 @@
}
</tbody>
</table>
</div>
}
}
</div>
@@ -13,6 +13,7 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="page-head"><h1>@(IsEditMode ? "Edit Site" : "Add Site")</h1></div>
<div class="mb-3">
<button class="btn btn-outline-secondary btn-sm" @onclick="GoBack">
&larr; Back
@@ -23,7 +24,7 @@
<div class="card mb-3">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-semibold">@(IsEditMode ? "Edit Site" : "Add Site")</span>
<h2 class="h6 mb-0">Site details</h2>
@* Drill-in: deep-link into the central Audit
Log pre-filtered to this site's events. AuditEvent.SourceSiteId
stores the SiteIdentifier (string), so we pass that through. *@
@@ -22,8 +22,8 @@
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="d-flex align-items-baseline">
<h4 class="mb-0">Site Management</h4>
<div class="page-head align-items-baseline">
<h1 class="mb-0">Site Management</h1>
@if (_updates is not null)
{
<span class="small text-muted ms-2">Updates as of @_updates.ComputedAt.ToString("HH:mm:ss") UTC</span>
@@ -10,7 +10,7 @@
<PageTitle>Audit Log</PageTitle>
<div class="container-fluid mt-3">
<h1 class="h4 mb-3">Audit Log</h1>
<div class="page-head"><h1 class="mb-0">Audit Log</h1></div>
@* Trends panel. A best-effort collapsible Bootstrap card sitting
above the audit query UI: one KpiTrendChart per AuditLog global metric over
@@ -10,7 +10,7 @@
@inject IJSRuntime JS
<div class="container-fluid mt-3">
<h4 class="mb-3">Configuration Audit Log</h4>
<div class="page-head"><h1 class="mb-0">Configuration Audit Log</h1></div>
<ToastNotification @ref="_toast" />
@@ -84,8 +84,9 @@
@if (_entries != null)
{
<table class="table table-sm table-striped table-hover">
<thead class="table-dark">
<div class="table-responsive" role="region" aria-label="Configuration audit log" tabindex="0">
<table class="table table-sm table-striped table-hover">
<thead>
<tr>
<th>Timestamp</th>
<th>User</th>
@@ -176,6 +177,7 @@
}
</tbody>
</table>
</div>
<OffsetPager Page="_page" PageChanged="OnPageChanged" HasNextPage="HasMore" TotalCount="_totalCount" PageSize="_pageSize" />
}
@@ -18,7 +18,7 @@
just the Audit Log + Configuration Audit Log pages). *@
<div class="container-fluid mt-3">
<h1 class="h4 mb-3">Execution Chain</h1>
<div class="page-head"><h1 class="mb-0">Execution Chain</h1></div>
@if (_executionId is null)
{
@@ -7,8 +7,8 @@
@inject IInboundApiKeyAdmin ApiKeyAdmin
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Welcome to ScadaBridge</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Welcome to ScadaBridge</h1>
<AuthorizeView>
<Authorized>
<span class="text-muted small">
@@ -17,7 +17,7 @@
@implements IDisposable
<div class="container-fluid mt-3">
<h4 class="mb-3">Debug View</h4>
<div class="page-head"><h1 class="mb-0">Debug View</h1></div>
<ToastNotification @ref="_toast" />
@@ -10,8 +10,8 @@
@implements IDisposable
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Deployment Status</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Deployment Status</h1>
<div class="btn-group btn-group-sm" role="group" aria-label="Deployment list actions">
<button class="btn btn-outline-secondary" @onclick="ToggleAutoRefresh"
aria-label="@(_autoRefresh ? "Pause auto-refresh" : "Resume auto-refresh")">
@@ -118,8 +118,9 @@
}
else
{
<table class="table table-sm table-striped table-hover align-middle">
<thead class="table-dark">
<div class="table-responsive" role="region" aria-label="Deployment status" tabindex="0">
<table class="table table-sm table-striped table-hover align-middle">
<thead>
<tr>
<th>Deployment</th>
<th>Instance</th>
@@ -205,6 +206,7 @@
}
</tbody>
</table>
</div>
}
@if (_totalPages > 1)
@@ -11,7 +11,7 @@
<PageTitle>Flow Debugger</PageTitle>
<div class="container-fluid mt-3">
<h4 class="mb-3">Flow Debugger</h4>
<div class="page-head"><h1 class="mb-0">Flow Debugger</h1></div>
<ToastNotification @ref="_toast" />
@* ── Toolbar ─────────────────────────────────────────────────────────── *@
@@ -31,11 +31,11 @@
font-weight: 600;
}
.fd-chip.idle { color: var(--ink-soft); }
.fd-chip.predicted { color: var(--accent); border-color: var(--accent); border-style: dashed; }
.fd-chip.running { color: var(--accent); border-color: var(--accent); }
.fd-chip.completed { color: var(--ok); border-color: var(--ok); }
.fd-chip.failed { color: var(--bs-danger, #c0392b); border-color: var(--bs-danger, #c0392b); }
.fd-chip.timed-out { color: var(--warn); border-color: var(--warn); }
.fd-chip.predicted { color: var(--accent-deep); border-color: var(--accent); border-style: dashed; }
.fd-chip.running { color: var(--accent-deep); border-color: var(--accent); }
.fd-chip.completed { color: var(--ok-ink); border-color: var(--ok); }
.fd-chip.failed { color: var(--bad-ink, #c0392b); border-color: var(--bs-danger, #c0392b); }
.fd-chip.timed-out { color: var(--warn-ink); border-color: var(--warn); }
.fd-flow-tools {
display: flex;
@@ -84,7 +84,7 @@
::deep .fsd-exc-type {
font-family: var(--mono, var(--bs-font-monospace));
font-weight: 600;
color: var(--bad, var(--bs-danger, #e03131));
color: var(--bad-ink, var(--bs-danger, #e03131));
}
::deep .fsd-exc-detail {
@@ -120,6 +120,6 @@
border-radius: 3px;
}
::deep .fsd-lvl-info { color: var(--ink-soft, var(--bs-secondary-color)); background: var(--rule, rgba(0, 0, 0, 0.06)); }
::deep .fsd-lvl-warn { color: var(--warn, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
::deep .fsd-lvl-error { color: var(--bad, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
::deep .fsd-lvl-warn { color: var(--warn-ink, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
::deep .fsd-lvl-error { color: var(--bad-ink, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
::deep .fsd-lvl-debug { color: var(--ink-faint, var(--bs-tertiary-color)); background: transparent; border: 1px dashed var(--rule-strong, var(--bs-border-color)); }
@@ -26,9 +26,9 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<button class="btn btn-outline-secondary btn-sm me-3" @onclick="GoBack">&larr; Back to Topology</button>
<h4 class="mb-0">Configure Instance</h4>
<h1 class="mb-0">Configure Instance</h1>
@* Drill-in: deep-link into the central Audit Log
pre-filtered to this instance. Instance is UI-only on the filter bar
(AuditEvent has no Instance column), so we use the ?instance= UI-text
@@ -209,9 +209,9 @@
</div>
@if (open)
{
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="@($"Binding group {g.Key}")" tabindex="0">
<table class="table table-sm table-bordered mb-0 align-middle">
<thead class="table-light">
<thead>
<tr>
<th>Member</th>
<th>Template default</th>
@@ -347,8 +347,9 @@
}
else
{
<table class="table table-sm table-bordered mb-0 align-middle">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Attribute overrides" tabindex="0">
<table class="table table-sm table-bordered mb-0 align-middle">
<thead>
<tr>
<th>Attribute</th>
<th>Type</th>
@@ -416,6 +417,7 @@
}
</tbody>
</table>
</div>
<div class="p-2">
<button class="btn btn-success btn-sm" @onclick="SaveOverrides" disabled="@_saving">Save Overrides</button>
</div>
@@ -435,8 +437,9 @@
}
else
{
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Alarm overrides" tabindex="0">
<table class="table table-sm table-bordered mb-0">
<thead>
<tr>
<th>Alarm</th>
<th style="width: 110px;">Trigger</th>
@@ -501,6 +504,7 @@
}
</tbody>
</table>
</div>
}
</div>
</div>
@@ -645,8 +649,9 @@
}
else
{
<table class="table table-sm table-bordered mb-0 align-middle">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Native alarm source overrides" tabindex="0">
<table class="table table-sm table-bordered mb-0 align-middle">
<thead>
<tr>
<th>Source</th>
<th>Inherited</th>
@@ -722,6 +727,7 @@
}
</tbody>
</table>
</div>
}
</div>
</div>
@@ -24,9 +24,9 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<a href="/deployment/topology" class="btn btn-outline-secondary btn-sm me-3">&larr; Back</a>
<h4 class="mb-0">Create Instance</h4>
<h1 class="mb-0">Create Instance</h1>
</div>
@if (_loading)
@@ -58,6 +58,8 @@
ErrorMessage="@_moveInstanceError"
OnSubmit="SubmitMoveInstance" />
<div class="page-head"><h1>Topology</h1></div>
@if (_loading)
{
<LoadingSpinner IsLoading="true" />
@@ -68,22 +70,22 @@
}
else
{
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Topology</h4>
</div>
<div class="d-flex align-items-center mb-2 gap-2 flex-wrap">
<input aria-label="Search loaded sites, areas and instances" type="text" class="form-control form-control-sm" style="max-width: 320px;"
placeholder="Search loaded sites, areas, instances..."
@bind="_searchText" @bind:event="oninput" @bind:after="OnSearchChanged" />
<div class="btn-group btn-group-sm" role="group" aria-label="Topology actions">
<button class="btn btn-outline-secondary" @onclick="OpenCreateAreaDialogRoot">+ Area</button>
<button class="btn btn-outline-secondary"
<button class="btn btn-primary"
@onclick='() => NavigationManager.NavigateTo("/deployment/instances/create")'>+ Instance</button>
<button class="btn btn-outline-secondary" aria-label="Refresh topology" @onclick="LoadDataAsync" disabled="@_actionInProgress">Refresh</button>
<button class="btn btn-outline-secondary" aria-label="Expand all areas" @onclick="() => _tree?.ExpandAll()">Expand</button>
<button class="btn btn-outline-secondary" aria-label="Collapse all areas" @onclick="() => _tree?.CollapseAll()">Collapse</button>
</div>
<button class="btn btn-outline-secondary btn-sm" aria-label="Re-check staleness"
<details class="topology-actions-disclosure">
<summary class="btn btn-outline-secondary btn-sm">More actions <i class="bi bi-chevron-down" aria-hidden="true"></i></summary>
<div class="d-flex gap-2 flex-wrap mt-2" role="group" aria-label="More topology actions">
<button class="btn btn-outline-secondary" @onclick="OpenCreateAreaDialogRoot">+ Area</button>
<button class="btn btn-outline-secondary" aria-label="Expand all areas" @onclick="() => _tree?.ExpandAll()">Expand</button>
<button class="btn btn-outline-secondary" aria-label="Collapse all areas" @onclick="() => _tree?.CollapseAll()">Collapse</button>
<button class="btn btn-outline-secondary btn-sm" aria-label="Re-check staleness"
title="Recompute the Stale/Current badge for loaded deployed instances"
@onclick="RecheckStalenessAsync" disabled="@_recheckingStaleness">
@if (_recheckingStaleness)
@@ -96,6 +98,8 @@
<span><i class="bi bi-arrow-repeat me-1"></i>Re-check staleness</span>
}
</button>
</div>
</details>
<div class="form-check form-switch ms-2 mb-0">
<input type="checkbox" class="form-check-input" id="live-updates"
checked="@_liveUpdates" @onchange="OnLiveUpdatesToggled" />
@@ -23,7 +23,7 @@
<div class="container-fluid mt-3">
<button class="btn btn-outline-secondary btn-sm mb-2" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-3">@(Id.HasValue ? "Edit API Method" : "Add API Method")</h4>
<div class="page-head"><h1 class="mb-0">@(Id.HasValue ? "Edit API Method" : "Add API Method")</h1></div>
@if (_loading)
{
@@ -10,9 +10,9 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3" data-test="connection-certificates">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<button class="btn btn-outline-secondary btn-sm me-3" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-0">Server Certificates@(string.IsNullOrEmpty(_connectionName) ? "" : $" — {_connectionName}")</h4>
<h1 class="mb-0">Server Certificates@(string.IsNullOrEmpty(_connectionName) ? "" : $" — {_connectionName}")</h1>
</div>
<div class="alert alert-info py-2 small">
@@ -44,7 +44,8 @@
}
else
{
<table class="table table-sm table-hover align-middle">
<div class="table-responsive" role="region" aria-label="Connection Certificates records" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead>
<tr>
<th>Subject</th>
@@ -91,6 +92,7 @@
}
</tbody>
</table>
</div>
}
}
</div>
@@ -18,9 +18,9 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<button class="btn btn-outline-secondary btn-sm me-3" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-0">@(Id.HasValue ? "Edit Data Connection" : "Add Data Connection")</h4>
<h1 class="mb-0">@(Id.HasValue ? "Edit Data Connection" : "Add Data Connection")</h1>
</div>
@if (_loading)
@@ -16,8 +16,8 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Connections</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Connections</h1>
<div class="d-flex gap-2">
<div class="dropdown">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle"
@@ -13,7 +13,7 @@
<div class="container-fluid mt-3">
<button class="btn btn-outline-secondary btn-sm mb-2" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-3">@(Id.HasValue ? "Edit Database Connection" : "Add Database Connection")</h4>
<div class="page-head"><h1 class="mb-0">@(Id.HasValue ? "Edit Database Connection" : "Add Database Connection")</h1></div>
@if (_loading)
{
@@ -13,8 +13,8 @@
<div class="container-fluid mt-3">
<button class="btn btn-outline-secondary btn-sm mb-2" @onclick="GoBack">&larr; Back</button>
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">@(Id.HasValue ? "Edit External System" : "Add External System")</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">@(Id.HasValue ? "Edit External System" : "Add External System")</h1>
@* Drill-in: deep-link into the central Audit Log
pre-filtered to this external system's outbound API events. Audit rows
record the target by external-system name, so we filter on Target. *@
@@ -13,8 +13,8 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Integration Definitions</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Integration Definitions</h1>
</div>
<ToastNotification @ref="_toast" />
@@ -12,8 +12,8 @@
— the guard-running ManagementActor path — never a direct repo write. *@
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Schema Library</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Schema Library</h1>
@if (!_editing)
{
<button class="btn btn-primary btn-sm" @onclick="BeginCreate">New Schema</button>
@@ -76,7 +76,8 @@
}
else
{
<table class="table table-sm align-middle">
<div class="table-responsive" role="region" aria-label="Schema library" tabindex="0">
<table class="table table-sm align-middle">
<thead>
<tr>
<th>Name</th>
@@ -112,6 +113,7 @@
}
</tbody>
</table>
</div>
}
</div>
@@ -14,9 +14,9 @@
@implements IDisposable
<div class="container-fluid mt-3">
<div class="d-flex align-items-center mb-3">
<div class="page-head">
<button class="btn btn-outline-secondary btn-sm me-3" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-0">@(Id.HasValue ? $"Edit Shared Script: {_formName}" : "New Shared Script")</h4>
<h1 class="mb-0">@(Id.HasValue ? $"Edit Shared Script: {_formName}" : "New Shared Script")</h1>
</div>
@if (_loading)
@@ -11,8 +11,8 @@
@inject IDialogService Dialog
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Shared Scripts</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Shared Scripts</h1>
<button class="btn btn-primary btn-sm" @onclick='() => NavigationManager.NavigateTo("/design/shared-scripts/create")'>New Script</button>
</div>
@@ -17,7 +17,7 @@
@onclick="GoBack">← Back</button>
</div>
<h4 class="mb-3">Create Template</h4>
<div class="page-head"><h1 class="mb-0">Create Template</h1></div>
@if (_loading)
{
@@ -32,6 +32,11 @@
@onclick="GoBack">← Templates</button>
</div>
@if (_loading || _loadError != null || _selectedTemplate == null)
{
<div class="page-head"><h1>Template</h1></div>
}
@if (_loading)
{
<LoadingSpinner IsLoading="true" />
@@ -268,9 +273,9 @@
@* Identity block: the template name leads, with the qualified path /
inheritance relation stacked beneath it rather than run together on
one heading line. *@
<div class="d-flex justify-content-between align-items-start mb-3">
<div class="page-head justify-content-between">
<div>
<h4 class="mb-0">@_selectedTemplate.Name</h4>
<h1 class="mb-0">@_selectedTemplate.Name</h1>
@if (_selectedTemplate.ParentTemplateId.HasValue && !_selectedTemplate.IsDerived)
{
<div class="text-muted small">inherits @(_templates.FirstOrDefault(t => t.Id == _selectedTemplate.ParentTemplateId)?.Name)</div>
@@ -484,8 +489,9 @@
<span class="fw-semibold">@title</span>
<span class="badge bg-secondary ms-1">@members.Count</span>
</div>
<table class="table table-sm table-striped mb-0">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="@title" tabindex="0">
<table class="table table-sm table-striped mb-0">
<thead>
<tr>
<th>Name</th>
<th>Effective value</th>
@@ -546,6 +552,7 @@
}
</tbody>
</table>
</div>
</div>
}
};
@@ -672,8 +679,9 @@
</div>
var derived = _selectedTemplate!.IsDerived;
<table class="table table-sm table-striped">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Template attributes" tabindex="0">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
@@ -792,6 +800,7 @@
}
</tbody>
</table>
</div>
};
private async Task ToggleAttrLockedInDerived(TemplateAttribute attr, ChangeEventArgs e)
@@ -900,8 +909,9 @@
<button class="btn btn-primary btn-sm" @onclick="OpenAddAlarmDialog">Add Alarm</button>
</div>
<table class="table table-sm table-striped">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Template alarms" tabindex="0">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
<th>Trigger</th>
@@ -965,6 +975,7 @@
}
</tbody>
</table>
</div>
};
// ---- Native Alarms Tab ----
@@ -981,8 +992,9 @@
}
else
{
<table class="table table-sm table-striped">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Native alarm sources" tabindex="0">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
<th>Connection</th>
@@ -1034,6 +1046,7 @@
}
</tbody>
</table>
</div>
}
};
@@ -1149,8 +1162,9 @@
</div>
var derivedScripts = _selectedTemplate!.IsDerived;
<table class="table table-sm table-striped">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Template scripts" tabindex="0">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
<th>Trigger</th>
@@ -1251,6 +1265,7 @@
}
</tbody>
</table>
</div>
};
private async Task ToggleScriptLockedInDerived(TemplateScript script, ChangeEventArgs e)
@@ -27,8 +27,8 @@
}
else
{
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Templates</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Templates</h1>
<div class="d-flex gap-2">
<div class="dropdown">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle"
@@ -32,7 +32,7 @@
}
else
{
<h4 class="mb-3">Export Bundle</h4>
<div class="page-head"><h1 class="mb-0">Export Bundle</h1></div>
@* Step indicator — Bootstrap progress with discrete numbered pills. *@
<nav aria-label="Export wizard steps" class="mb-4">
@@ -23,7 +23,7 @@
*@
<div class="container-fluid mt-3">
<h4 class="mb-3">Import Bundle</h4>
<div class="page-head"><h1 class="mb-0">Import Bundle</h1></div>
@* Step indicator — five numbered pills, mirrors TransportExport. *@
<nav aria-label="Import wizard steps" class="mb-4">
@@ -231,7 +231,7 @@
</div>
</div>
<div class="table-responsive" style="max-height: 480px; overflow-y: auto;">
<div class="table-responsive" style="max-height: 480px; overflow-y: auto;" role="region" aria-label="Bundle contents" tabindex="0">
<table class="table table-sm table-striped align-middle">
<thead>
<tr>
@@ -346,7 +346,8 @@
@if (hasSiteMappings)
{
<h6 class="small text-uppercase text-body-secondary">Sites</h6>
<table class="table table-sm align-middle mb-4" data-testid="map-sites-table">
<div class="table-responsive" role="region" aria-label="Import site mappings" tabindex="0">
<table class="table table-sm align-middle mb-4" data-testid="map-sites-table">
<thead>
<tr>
<th>Source identifier</th>
@@ -380,6 +381,7 @@
}
</tbody>
</table>
</div>
}
@if (hasConnMappings)
@@ -397,7 +399,8 @@
<span class="badge bg-success ms-1">new site</span>
}
</div>
<table class="table table-sm align-middle mb-0" data-testid="map-conns-table">
<div class="table-responsive" role="region" aria-label="@($"Import connection mappings for {grp.Key}")" tabindex="0">
<table class="table table-sm align-middle mb-0" data-testid="map-conns-table">
<thead>
<tr>
<th>Source connection</th>
@@ -428,6 +431,7 @@
}
</tbody>
</table>
</div>
</div>
}
}
@@ -14,8 +14,8 @@
@inject ZB.MOM.WW.ScadaBridge.CentralUI.Auth.SiteScopeService SiteScope
<div class="container-fluid mt-3" data-test="alarm-summary">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Alarm Summary</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Alarm Summary</h1>
<div class="d-flex align-items-center">
@if (_selectedSiteId != null)
{
@@ -177,7 +177,7 @@
else
{
<div class="text-muted small mb-2">Showing @_visibleRows.Count of @_rows.Count</div>
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Alarm summary" tabindex="0">
<table class="table table-sm table-hover align-middle">
@* UA6 (arch-review): sortable headers are keyboard-operable — tabindex="0",
aria-sort reflects the active sort direction, and Enter/Space toggle the
@@ -9,8 +9,8 @@
@inject CommunicationService CommunicationService
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Site Event Logs</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Site Event Logs</h1>
<button class="btn btn-outline-secondary btn-sm"
type="button"
data-bs-toggle="collapse"
@@ -98,8 +98,9 @@
@if (_entries != null)
{
<table class="table table-sm table-striped table-hover">
<thead class="table-dark">
<div class="table-responsive" role="region" aria-label="Site event log results" tabindex="0">
<table class="table table-sm table-striped table-hover">
<thead>
<tr>
<th style="width: 1%;"></th>
<th>Timestamp</th>
@@ -154,6 +155,7 @@
}
</tbody>
</table>
</div>
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted small">
@@ -22,8 +22,8 @@
@inject Microsoft.Extensions.Options.IOptions<HealthMonitoringOptions> HealthOptions
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Health Dashboard</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Health Dashboard</h1>
<div>
<span class="text-muted small me-2">Auto-refresh: @(_autoRefreshSeconds)s</span>
<button class="btn btn-outline-secondary btn-sm" @onclick="RefreshNow">Refresh Now</button>
@@ -360,7 +360,8 @@
<h6 class="text-muted mb-0">Nodes (@NodeRowCount(state))</h6>
</div>
<div class="card-body p-2">
<table class="table table-sm table-borderless mb-0">
<div class="table-responsive" role="region" aria-label="@($"Nodes for {siteName}")" tabindex="0">
<table class="table table-sm table-borderless mb-0">
<tbody>
@if (report.ClusterNodes is { Count: > 0 })
{
@@ -406,6 +407,7 @@
}
</tbody>
</table>
</div>
</div>
</div>
</div>
@@ -444,7 +446,8 @@
</div>
@if (quality != null)
{
<table class="table table-sm table-borderless mb-0">
<div class="table-responsive" role="region" aria-label="@($"Tag quality for {connName} at {siteName}")" tabindex="0">
<table class="table table-sm table-borderless mb-0">
<tbody>
<tr>
<td class="small text-muted py-0">Tags good</td>
@@ -460,6 +463,7 @@
</tr>
</tbody>
</table>
</div>
}
</div>
}
@@ -483,7 +487,8 @@
<div class="collapse" id="@($"{detailsCollapseId}-queues")">
<div class="card-body p-2">
<h6 class="text-muted mb-2 border-bottom pb-1">Instances</h6>
<table class="table table-sm table-borderless mb-0">
<div class="table-responsive" role="region" aria-label="@($"Instances for {siteName}")" tabindex="0">
<table class="table table-sm table-borderless mb-0">
<tbody>
<tr>
<td class="small">Deployed</td>
@@ -499,6 +504,7 @@
</tr>
</tbody>
</table>
</div>
<h6 class="text-muted mb-2 mt-3 border-bottom pb-1">
Store-and-Forward Buffers (@report.StoreAndForwardBufferDepths.Count)
@@ -536,7 +542,8 @@
<div class="collapse" id="@($"{detailsCollapseId}-errors")">
<div class="card-body p-2">
<h6 class="text-muted mb-2 border-bottom pb-1">Error Counts</h6>
<table class="table table-sm table-borderless mb-0">
<div class="table-responsive" role="region" aria-label="@($"Error counts for {siteName}")" tabindex="0">
<table class="table table-sm table-borderless mb-0">
<tbody>
<tr>
<td class="small">Script Errors</td>
@@ -558,6 +565,7 @@
</tr>
</tbody>
</table>
</div>
<h6 class="text-muted mb-2 mt-3 border-bottom pb-1">Parked Messages</h6>
@if (report.ParkedMessageCount == 0)
@@ -17,8 +17,8 @@
<div class="container-fluid mt-3">
<ToastNotification @ref="_toast" />
<div class="d-flex align-items-baseline flex-wrap mb-3">
<h4 class="mb-0 me-3">Parked Messages</h4>
<div class="page-head align-items-baseline flex-wrap">
<h1 class="mb-0">Parked Messages</h1>
@if (_messages != null && _messages.Count > 0)
{
<span class="text-muted small">
@@ -160,9 +160,9 @@
else
{
var filtered = FilteredMessages;
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Parked messages" tabindex="0">
<table class="table table-sm table-hover mb-2 align-middle parked-table">
<thead class="table-light">
<thead>
<tr>
<th style="width: 36px;">
<input class="form-check-input" type="checkbox"
@@ -13,8 +13,8 @@
@inject ILogger<NotificationKpis> Logger
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Notification KPIs</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Notification KPIs</h1>
<button class="btn btn-outline-secondary btn-sm" @onclick="RefreshAll" disabled="@_loading">
@if (_loading) { <span class="spinner-border spinner-border-sm me-1" role="status"></span> }
Refresh
@@ -88,9 +88,9 @@
}
else
{
<div class="table-responsive mb-3">
<div class="table-responsive mb-3" role="region" aria-label="Notification per-node breakdown" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead class="table-light">
<thead>
<tr>
<th>Node</th>
<th class="text-end">Queue Depth</th>
@@ -133,9 +133,9 @@
}
else
{
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Notification per-site breakdown" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead class="table-light">
<thead>
<tr>
<th>Site</th>
<th class="text-end">Queue Depth</th>
@@ -15,7 +15,7 @@
<div class="container-fluid mt-3">
<button class="btn btn-link text-decoration-none ps-0 mb-2" @onclick="GoBack">&larr; Back</button>
<h4 class="mb-3">@(Id.HasValue ? "Edit Notification List" : "Add Notification List")</h4>
<div class="page-head"><h1 class="mb-0">@(Id.HasValue ? "Edit Notification List" : "Add Notification List")</h1></div>
@if (_loading)
{
@@ -92,8 +92,9 @@
</div>
</div>
<table class="table table-sm table-striped">
<thead class="table-light">
<div class="table-responsive" role="region" aria-label="Notification recipients" tabindex="0">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
<th>@(_type == NotificationType.Sms ? "Phone" : "Email")</th>
@@ -121,6 +122,7 @@
}
</tbody>
</table>
</div>
}
}
</div>
@@ -14,8 +14,8 @@
<div class="container-fluid mt-3">
<ToastNotification @ref="_toast" />
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Notification Lists</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Notification Lists</h1>
<button class="btn btn-primary btn-sm"
@onclick='() => NavigationManager.NavigateTo("/notifications/lists/create")'>
Add Notification List
@@ -44,9 +44,9 @@
}
else
{
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Notification lists" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead class="table-light">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
@@ -17,8 +17,8 @@
<div class="container-fluid mt-3">
<ToastNotification @ref="_toast" />
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Notification Report</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Notification Report</h1>
<button class="btn btn-outline-secondary btn-sm" @onclick="RefreshAll" disabled="@_loading">
@if (_loading) { <span class="spinner-border spinner-border-sm me-1" role="status"></span> }
Refresh
@@ -142,9 +142,9 @@
}
else
{
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Notification report results" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead class="table-light">
<thead>
<tr>
<th>ID</th>
<th>Type</th>
@@ -10,8 +10,8 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">SMS Configuration</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">SMS Configuration</h1>
</div>
<ToastNotification @ref="_toast" />
@@ -10,8 +10,8 @@
@inject NavigationManager NavigationManager
<div class="container-fluid mt-3">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">SMTP Configuration</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">SMTP Configuration</h1>
</div>
<ToastNotification @ref="_toast" />
@@ -28,8 +28,8 @@
<div class="container-fluid mt-3" data-test="secured-writes">
<ToastNotification @ref="_toast" />
<div class="d-flex align-items-baseline flex-wrap mb-3">
<h4 class="mb-0 me-3">Secured Writes</h4>
<div class="page-head align-items-baseline flex-wrap">
<h1 class="mb-0">Secured Writes</h1>
</div>
@* ── Operator region: submit form ───────────────────────────────────── *@
@@ -121,7 +121,8 @@
}
else
{
<table class="table table-sm table-hover mb-0 align-middle">
<div class="table-responsive" role="region" aria-label="Secured write requests" tabindex="0">
<table class="table table-sm table-hover mb-0 align-middle">
<thead>
<tr>
<th>Site</th>
@@ -173,6 +174,7 @@
}
</tbody>
</table>
</div>
}
</div>
</div>
@@ -189,7 +191,8 @@
}
else
{
<table class="table table-sm mb-0 align-middle">
<div class="table-responsive" role="region" aria-label="Secured write requests" tabindex="0">
<table class="table table-sm mb-0 align-middle">
<thead>
<tr>
<th>Site</th>
@@ -230,6 +233,7 @@
}
</tbody>
</table>
</div>
}
@if (_historyTotalCount > HistoryPageSize)
{
@@ -16,8 +16,8 @@
<div class="container-fluid mt-3">
<ToastNotification @ref="_toast" />
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="mb-0">Site Calls</h4>
<div class="page-head justify-content-between">
<h1 class="mb-0">Site Calls</h1>
<button class="btn btn-outline-secondary btn-sm" @onclick="RefreshAll" disabled="@_loading">
@if (_loading) { <span class="spinner-border spinner-border-sm me-1" role="status"></span> }
Refresh
@@ -143,9 +143,9 @@
}
else
{
<div class="table-responsive">
<div class="table-responsive" role="region" aria-label="Site call results" tabindex="0">
<table class="table table-sm table-hover align-middle">
<thead class="table-light">
<thead>
<tr>
<th>Tracked operation</th>
<th>Source site</th>
@@ -27,8 +27,9 @@
}
</div>
<div class="table-responsive" role="region" aria-label="@TableLabel" tabindex="0">
<table class="table table-sm table-striped table-hover">
<thead class="table-dark">
<thead>
<tr>
@HeaderContent
</tr>
@@ -49,6 +50,7 @@
}
</tbody>
</table>
</div>
@if (_totalPages > 1)
{
@@ -87,7 +89,14 @@
}
<div class="text-muted small">
Showing @((_currentPage - 1) * PageSize + 1)&ndash;@Math.Min(_currentPage * PageSize, _filteredItems.Count) of @_filteredItems.Count items
@if (_filteredItems.Count == 0)
{
<text>0 items</text>
}
else
{
<text>Showing @((_currentPage - 1) * PageSize + 1)&ndash;@Math.Min(_currentPage * PageSize, _filteredItems.Count) of @_filteredItems.Count items</text>
}
</div>
@code {
@@ -104,6 +113,8 @@
[Parameter] public RenderFragment? FilterContent { get; set; }
[Parameter] public int PageSize { get; set; } = 25;
[Parameter] public bool ShowSearch { get; set; } = true;
/// <summary>Accessible name for the keyboard-scrollable table region.</summary>
[Parameter] public string TableLabel { get; set; } = "Data table";
[Parameter] public string EmptyMessage { get; set; } = "No items found.";
[Parameter] public Func<TItem, string, bool>? SearchFilter { get; set; }
@@ -41,7 +41,7 @@
}
.fg-node.predicted .fg-node-box { stroke-dasharray: 4 3; }
.fg-node.input-dependent .fg-node-box { stroke-dasharray: 2 3; }
.fg-node.ghost { opacity: 0.45; }
/* Ghost text stays readable; the existing dashed shape and tinted fill carry prediction. */
.fg-node.ghost .fg-node-box { fill: var(--rule); fill-opacity: 0.35; }
.fg-node.failed .fg-node-box,
.fg-node.timed-out .fg-node-box { stroke: var(--bs-danger, #c0392b); }
@@ -79,14 +79,14 @@
.fg-foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 4px; min-width: 0; }
.fg-subtitle { color: var(--ink-soft); font-size: 0.66rem; flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fg-node.failed .fg-subtitle,
.fg-node.timed-out .fg-subtitle { color: var(--bad, var(--bs-danger, #e03131)); font-family: var(--mono); }
.fg-node.timed-out .fg-subtitle { color: var(--bad-ink, var(--bs-danger, #e03131)); font-family: var(--mono); }
.fg-logs { display: inline-flex; gap: 3px; flex-shrink: 0; font-family: var(--mono); font-size: 0.6rem; font-variant-numeric: tabular-nums; }
.fg-logs i { font-style: normal; padding: 0 4px; border-radius: 3px; line-height: 1.35; }
.fg-logs i.e { color: var(--bad, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
.fg-logs i.w { color: var(--warn, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-logs i.e { color: var(--bad-ink, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
.fg-logs i.w { color: var(--warn-ink, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-logs i.i { color: var(--ink-faint); background: var(--rule); }
.fg-node.failed .fg-eyebrow,
.fg-node.timed-out .fg-eyebrow { color: var(--bs-danger, #c0392b); }
.fg-node.timed-out .fg-eyebrow { color: var(--bad-ink, #c0392b); }
/* Outbound nodes (API call / database / notify): the folded outcome as a status pill, then the
call mode. Kit status tokens first (dark mode follows via site.css), Bootstrap's as fallback. */
@@ -106,21 +106,13 @@
background: var(--rule);
}
.fg-pill::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: currentColor; }
.fg-pill.ok { color: var(--ok, var(--bs-success, #2f9e44)); background: var(--ok-bg, rgba(var(--bs-success-rgb, 25, 135, 84), 0.12)); }
.fg-pill.pending { color: var(--warn, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-pill.parked { color: var(--warn, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-pill.failed { color: var(--bad, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
.fg-pill.ok { color: var(--ok-ink, var(--bs-success, #2f9e44)); background: var(--ok-bg, rgba(var(--bs-success-rgb, 25, 135, 84), 0.12)); }
.fg-pill.pending { color: var(--warn-ink, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-pill.parked { color: var(--warn-ink, var(--bs-warning, #e8920c)); background: var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
.fg-pill.failed { color: var(--bad-ink, var(--bs-danger, #e03131)); background: var(--bad-bg, rgba(var(--bs-danger-rgb, 220, 53, 69), 0.12)); }
.fg-mode { color: var(--ink-soft); font-size: 0.66rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* A pending pill pulses while the page keeps refreshing outcomes after a Live run. */
.fg-node.pending .fg-pill { animation: fg-pulse 1.6s ease-in-out infinite; }
@keyframes fg-pulse {
0%, 100% { opacity: 1; box-shadow: 0 0 0 0 var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
50% { opacity: 0.6; box-shadow: 0 0 0 4px var(--warn-bg, rgba(var(--bs-warning-rgb, 255, 193, 7), 0.15)); }
}
@media (prefers-reduced-motion: reduce) {
.fg-node.pending .fg-pill { animation: none; }
}
/* Pending remains an explicit label while outcomes refresh. Do not fade text. */
/* Connectors */
.fg-edge {
@@ -4,12 +4,12 @@
.ft-lane-select { width: auto; }
.ft-table th { font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-soft); }
.ft-row { cursor: pointer; }
.ft-row:hover, .ft-row:focus-visible { background: var(--active-bg); outline: none; }
.ft-row:hover, .ft-row:focus-visible { background: var(--active-bg); }
.ft-row.selected { background: var(--active-bg); box-shadow: inset 3px 0 0 var(--accent); }
.ft-row.failed { box-shadow: inset 3px 0 0 var(--bs-danger, #c0392b); }
.ft-title { max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); font-size: 0.8rem; }
.ft-pill { font-size: 0.7rem; border: 1px solid var(--rule-strong); border-radius: 10px; padding: 0 6px; }
.ft-pill.ok { color: var(--bs-success, #2e7d32); }
.ft-pill.pending { color: var(--accent); }
.ft-pill.parked { color: var(--warn, var(--bs-warning, #e8920c)); }
.ft-pill.failed { color: var(--bs-danger, #c0392b); border-color: var(--bs-danger, #c0392b); }
.ft-pill.ok { color: var(--ok-ink, #2e7d32); }
.ft-pill.pending { color: var(--accent-deep); }
.ft-pill.parked { color: var(--warn-ink, var(--bs-warning, #e8920c)); }
.ft-pill.failed { color: var(--bad-ink, #c0392b); border-color: var(--bs-danger, #c0392b); }
@@ -204,3 +204,13 @@
.rail-updates-detail { color: var(--ink-faint); }
.rail-updates a { color: inherit; text-decoration: underline dotted; }
.rail-updates a:hover { color: var(--accent); }
/* Bootstrap text utilities bridge to shared readable text inks. Status signal
variables remain unchanged for decorative dots, borders and backgrounds. */
.text-success { color: var(--ok-ink) !important; }
.text-warning { color: var(--warn-ink) !important; }
.text-danger { color: var(--bad-ink) !important; }
.text-info { color: var(--info-ink) !important; }
.text-primary { color: var(--accent-deep) !important; }
.text-secondary { color: var(--ink-soft) !important; }
.text-muted, .text-body-secondary, .text-body-tertiary { color: var(--ink-faint) !important; }
@@ -23,6 +23,39 @@ public class DataTablePagerTests : BunitContext
.Add(p => p.RowContent, (RenderFragment<int>)(item => b => b.AddMarkupContent(0, $"<tr><td>{item}</td></tr>"))));
}
/// <summary>True empty results show no contradictory one-to-zero range.</summary>
[Fact]
public void EmptyTable_ShowsZeroItems()
{
var cut = RenderTable(0);
Assert.Equal("0 items", cut.Find(".text-muted.small").TextContent.Trim());
}
/// <summary>Filtering to zero and clearing preserves the correct range and paging state.</summary>
[Fact]
public void FilterToEmpty_ThenClear_RestoresRealCount()
{
var cut = RenderTable(60);
cut.Render(p => p.Add(c => c.ShowSearch, true).Add(c => c.SearchFilter, (item, search) => item.ToString().Contains(search)));
cut.Find("input").Input("no-match");
Assert.Equal("0 items", cut.Find(".text-muted.small").TextContent.Trim());
cut.Find("button[aria-label='Clear search']").Click();
Assert.Contains("1–25 of 60 items", cut.Find(".text-muted.small").TextContent);
}
/// <summary>The reusable table has one named keyboard-accessible overflow region.</summary>
[Fact]
public void Table_HasNamedKeyboardScrollRegion()
{
var cut = RenderTable(4);
var region = cut.Find("[role=region]");
Assert.Equal("Data table", region.GetAttribute("aria-label"));
Assert.Equal("0", region.GetAttribute("tabindex"));
Assert.Single(region.QuerySelectorAll("table"));
cut.Render(p => p.Add(c => c.TableLabel, "Synthetic records"));
Assert.Equal("Synthetic records", cut.Find("[role=region]").GetAttribute("aria-label"));
}
private static int NumberedPageButtons(IRenderedComponent<DataTable<int>> cut)
=> cut.FindAll("ul.pagination li.page-item button")
.Count(b => int.TryParse(b.TextContent.Trim(), out _));
@@ -150,6 +150,26 @@ public class TopologyPageTests : BunitContext
});
}
/// <summary>Every load state keeps one semantic page title.</summary>
[Theory]
[InlineData("loading")]
[InlineData("loaded")]
[InlineData("error")]
public async Task PageTitle_RemainsOneH1AcrossLoadStates(string state)
{
SeedRepos();
var pending = new TaskCompletionSource<IReadOnlyList<Site>>(TaskCreationOptions.RunContinuationsAsynchronously);
if (state == "loading") _siteRepo.GetAllSitesAsync().Returns(pending.Task);
if (state == "error") _siteRepo.GetAllSitesAsync().Returns(Task.FromException<IReadOnlyList<Site>>(new Exception("local failure")));
var cut = Render<TopologyPage>();
try
{
Assert.Single(cut.FindAll("h1"));
Assert.Equal("Topology", cut.Find("h1").TextContent.Trim());
}
finally { await cut.InvokeAsync(() => pending.TrySetResult([])); }
}
private IRenderedComponent<TopologyPage> RenderLoadedTopology()
{
var cut = Render<TopologyPage>();