Name dialogs and contain native overlay keyboard focus

This commit is contained in:
Joseph Doherty
2026-11-13 17:42:14 -05:00
parent cdd3adf6fc
commit 87c882ec0a
46 changed files with 1353 additions and 119 deletions
@@ -0,0 +1,41 @@
# ScadaBridge UI consistency — first batch review
Baseline accepted G1 pilot commit: `cdd3adf6`; Theme 1.0.0 published exact package. This batch follows parent G1 acceptance; it does not change package pins, policies, validators, UTC handling, lazy loading or fleet services. Secrets.Ui adoption awaits SEC07 release. No deploys or live writes.
## Scope grouped for review
`evidence/sb01-03/source-groups.json` lists every changed path; `source-freeze-sha256.json` records the frozen review source. No SB04+ work started.
- **Dialog naming/lifecycle:** DialogHost title/body/prompt ID relationships; AuditDrilldownDrawer modal/name/Escape; native `dialog.js` per-overlay Map state, actual-event synchronous Tab prevention, filtered focusable children, reference-counted inert siblings, scroll-lock ownership, detached-node cleanup, connected-trigger or heading fallback; component disposal invokes deactivation. Existing Confirm/Prompt/Show result semantics and drawer OnClose are preserved. Generic extraction waits for a second consumer.
- **Label/ID associations:** 126 previously standalone labels associated with native controls across28 files, IDs scoped to component instances; repeated alarm-band keys include the band key. Mutually exclusive numeric/text/Boolean match controls share one relationship safely. Audit multi-select names combine visible field label and current summary; shared table search has a visible label and unique ID. Remaining contextual searches/table cells/move controls receive explicit names without changing bindings/callbacks/conditions.
- **Intentional caption conversions:** `caption-conversions.json` enumerates files. Composite schema/editor sections, result payloads, console output, button-group captions and list headings use caption divs instead of labels targeting no labelable element. Existing layout classes and content are retained; no output or parameter behavior changed.
- **Validation relationships:** OPC/Mx existing FieldError selection logic is retained and factored into a helper. Only fields already mapped by RenderFieldError get conditional aria-invalid, describedby and an error ID/alert. Successful removal of Errors removes invalidity and stale description. No new validation rule or validation bypass.
- **Tests:** existing dialog/drawer/OPC suites extended; new ControlLabelTests checks table search after typing. Strict clipboard test explicitly configures the new lifecycle interop and retains its clipboard payload assertions; no test mode weakening/skips.
## Test evidence
`red-dialogs.log`: two intended missing-name/modal failures. `red-labels.log` is retained as an invalid initial test fixture (required RowContent omitted); corrected fixture `red-labels-corrected-fixture.log` fails for the intended missing input ID. `red-validation.log` retains a compile error from a duplicate attribute found during the broad scan, then corrected; `red-validation-corrected.log` shows the intended missing aria-invalid failure. Duplicate ParkedMessages attribute was removed; its existing contextual accessible label remains unchanged.
Focused related suite: `green-batch.log`104 passed. Intermediate full suite: `full-suite.log`1554 passed/zero skipped before the last validation regression and source naming completion. Final frozen-source suite passed **1555/1555**, zero failures/skips (`final-suite.log`, `sb01-03-final.trx`).
## Browser pilot and remaining gates
Disposable new fixture source is retained in umbrella `components/ui-theme/validation/scadabridge-ui/host`; actual source RCL ProjectReference, anonymous/synthetic local services only. It binds127.0.0.1:5201, separate from retained G1 canary5199. Existing rigs untouched. `infra/tools/ui_consistency_browser.py` accepts explicit loopback base URL/storage-state/output directory; no real writes.
First matrix and one confirmation are retained separately under `browser/` and `browser-confirmation/`. Both passed name/prompt linkage, synchronous first/last Tab and Shift+Tab, hidden/disabled filtering, inert background, Escape, normal trigger focus return, lock cleanup, repeat opening and no-focusable containment at1440/390. **Disconnected-trigger fallback failed**: the native code focused the heading, then immediately removing its temporary tabindex made Chromium blur to BODY. Source now restores that attribute only after blur. No third broad screenshot/polish loop is claimed; A focused no-screenshot technical probe (`focused-fallback.json`) now confirms all three actual hosts restore the disconnected trigger to h1, retain tabindex while focused, clear it on blur, and release locks/inert. Parent lifecycle review remains required.
SB03 source inventory does not prove every composite editor's internal accessible name or field help/error relationship at runtime. Remaining work before calling SB03 complete: machine-check frozen associations, contextual duplicate IDs on repeated editors, all existing form help relationships, Monaco composite context, and rendered browser/assistive-tree samples for transport/notification/instance forms. Aggregate form errors must stay aggregate rather than falsely marking all fields invalid. These are explicit pending acceptance items, not covered by passing unit tests.
## Lifecycle review refinement
The supported policy is **one active overlay**, including the audit drawer and global DialogHost. No arbitrary nested or sibling overlay support is implied by the internal Map/ref-count bookkeeping. Native activation rejects any different active overlay or inert target. C# cancels a rejected service dialog through its unchanged typed cancellation path, or invokes the drawer's existing OnClose callback. DialogService's original second-dialog guard is retained. This prevents descendant Escape bubbling from closing two simultaneously active hosts.
A disposed DialogHost unsubscribes, cancels any pending local result, and deactivates its presentation. No new busy-operation semantics are introduced: confirm merely resolves the caller's result; domain work remains owned by the caller after the dialog closes. The adapter does not cancel or retry domain work. Source scan found no remaining callers of removed captureActiveElement/restoreActiveElement/focusTrap globals in src/tests. Browser evidence for the single-active rejection is `single-active-overlay.json`; it programmatically attempts a second local presentation while the real drawer is active, verifies cancellation/one remaining drawer, then verifies one Escape closes it and restores its trigger.
Final lifecycle-refined full suite: **1556/1556 passed**, zero skips/failures, `reviewed-suite.log` / `sb01-03-reviewed.trx`. This supersedes1555 for the additional rejection/disposal regression. No first-batch commit until parent source/lifecycle review accepts the frozen diff. Rollback reverts this batch only; accepted G1 package/palette pilot is separate.
## Peer finding closure and shared patch adoption
Native focus restoration now verifies document.activeElement after attempting the trigger; still-connected disabled/hidden/unfocusable triggers use heading fallback too. `unusable-trigger-red.json` preserves the reproduced disabled/hidden failures, `unusable-trigger-green.json` verifies all four target conditions and clean lock/inert/tabindex restoration. The retained Python test includes a span made unfocusable while still connected, not merely a replacement/disconnection.
Published Theme1.0.1 is restored from the official Gitea index into task-local `/tmp/scadabridge-theme101-packages`. Package SHA256995b117b0245577598c91404ed7957c071ebe3413696c8be48b419c9deb1bd5d and runtime DLL parity are in theme101-provenance.json; no stale default cache accepted. Full suite on the patch:1557/1557 passed, zero skips/failures. The added contextual TreeView checkbox regression remains SB03 work; its red failure is retained.
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,105 @@
{
"results": [
{
"width": 1440,
"kind": "confirm",
"title": "sb-dialog-fe51965f73ef4099946f9e8f7eb03d6a-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "prompt",
"title": "sb-dialog-33c8f61546d14cddb20a303d53c3e210-title",
"checks": {
"name": true,
"promptLabel": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "drawer",
"title": "sb-audit-drawer-08aca19b7f2448b4bef553a68c9641ab-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "no-focusable",
"checks": {
"contained": true
}
},
{
"width": 390,
"kind": "confirm",
"title": "sb-dialog-139bc61e341b4625b3728929f04c1cc9-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "prompt",
"title": "sb-dialog-829a5e47da2a45a18626ac8d606caebf-title",
"checks": {
"name": true,
"promptLabel": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "drawer",
"title": "sb-audit-drawer-8c2bf8e848fb4b4b995e619d0b073c96-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "no-focusable",
"checks": {
"contained": true
}
}
],
"passed": false
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,105 @@
{
"results": [
{
"width": 1440,
"kind": "confirm",
"title": "sb-dialog-8de688823ca14619989a4cf48285e7d3-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "prompt",
"title": "sb-dialog-3912c2fe4cec4fe1a5deccb2675bfbba-title",
"checks": {
"name": true,
"promptLabel": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "drawer",
"title": "sb-audit-drawer-b06b90411fd6467da7641ea24b806108-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 1440,
"kind": "no-focusable",
"checks": {
"contained": true
}
},
{
"width": 390,
"kind": "confirm",
"title": "sb-dialog-32a229ff0dd847bbae994ec3a7ad6008-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "prompt",
"title": "sb-dialog-1ed4b431330e401f9f87a8915ec2a493-title",
"checks": {
"name": true,
"promptLabel": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "drawer",
"title": "sb-audit-drawer-6acaa21506b44d76a0ecee9d9efa381d-title",
"checks": {
"name": true,
"lastWraps": true,
"firstWraps": true,
"backgroundInert": true,
"restored": true,
"unlocked": true,
"disconnectedFallback": false
}
},
{
"width": 390,
"kind": "no-focusable",
"checks": {
"contained": true
}
}
],
"passed": false
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

@@ -0,0 +1,13 @@
{
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor": 3,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor": 6,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor": 4,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateAlarmDialog.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateScriptDialog.razor": 5,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AlarmTriggerEditor.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AttributeListEditor.razor": 1,
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ScriptTriggerEditor.razor": 1
}
@@ -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.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.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.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.
Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb01-03/sb01-03-final.trx
Passed! - Failed: 0, Passed: 1555, Skipped: 0, Total: 1555, Duration: 33 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,26 @@
[
{
"kind": "confirm",
"headingFocused": true,
"tabindex": "-1",
"locked": false,
"inert": false,
"tabindexCleanedOnBlur": true
},
{
"kind": "prompt",
"headingFocused": true,
"tabindex": "-1",
"locked": false,
"inert": false,
"tabindexCleanedOnBlur": true
},
{
"kind": "drawer",
"headingFocused": true,
"tabindex": "-1",
"locked": false,
"inert": false,
"tabindexCleanedOnBlur": 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.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.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.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/sb01-03/sb01-03.trx
Passed! - Failed: 0, Passed: 1554, Skipped: 0, Total: 1554, Duration: 33 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.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: 104, Skipped: 0, Total: 104, Duration: 766 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,59 @@
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.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.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.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.36] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Components.Audit.AuditDrilldownDrawerTests.CopyAsCurl_InvokesClipboard_WithCurlString [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Components.Audit.AuditDrilldownDrawerTests.CopyAsCurl_InvokesClipboard_WithCurlString [3 ms]
Error Message:
Bunit.JSRuntimeUnhandledInvocationException : bUnit's JSInterop has not been configured to handle the call:
InvokeVoidAsync("sbDialog.activate", "sb-audit-drawer-dcc783d1f5974be7806d91fb02d629c1")
Configure bUnit's JSInterop to handle the call with following:
SetupVoid("sbDialog.activate", "sb-audit-drawer-dcc783d1f5974be7806d91fb02d629c1")
or the following, to match any arguments:
SetupVoid("sbDialog.activate", _ => true)
The setup methods are available on an instance of the BunitJSInterop or
BunitJSModuleInterop type. The standard BunitJSInterop is available
through the BunitContext.JSInterop property, and a BunitJSModuleInterop
instance is returned from calling SetupModule on a BunitJSInterop instance.
Stack Trace:
at Bunit.BunitJSInterop.TryHandlePlannedInvocation[TValue](JSRuntimeInvocation invocation) in /_/src/bunit/JSInterop/BunitJSInterop.cs:line 74
at Bunit.BunitJSInterop.HandleInvocation[TValue](JSRuntimeInvocation invocation) in /_/src/bunit/JSInterop/BunitJSInterop.cs:line 59
at Bunit.JSInterop.Implementation.JSRuntimeExtensions.HandleInvokeAsync[TValue](BunitJSInterop jSInterop, String identifier, Object[] args) in /_/src/bunit/JSInterop/Implementation/JSRuntimeExtensions.cs:line 9
at Bunit.JSInterop.BunitJSRuntime.InvokeAsync[TValue](String identifier, Object[] args) in /_/src/bunit/JSInterop/Implementation/BunitJSRuntime.cs:line 20
at Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(IJSRuntime jsRuntime, String identifier, Object[] args)
at ZB.MOM.WW.ScadaBridge.CentralUI.Components.Audit.AuditDrilldownDrawer.OnAfterRenderAsync(Boolean firstRender) in /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditDrilldownDrawer.razor.cs:line 49
at Bunit.Rendering.BunitRenderer.AssertNoUnhandledExceptions() in /_/src/bunit/Rendering/BunitRenderer.cs:line 703
at Bunit.Rendering.BunitRenderer.Render(RenderFragment renderFragment) in /_/src/bunit/Rendering/BunitRenderer.cs:line 597
at Bunit.Rendering.BunitRenderer.RenderFragment(RenderFragment renderFragment) in /_/src/bunit/Rendering/BunitRenderer.cs:line 137
at Bunit.BunitContext.RenderInsideRenderTree(RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 230
at Bunit.BunitContext.RenderInsideRenderTree[TComponent](RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 214
at Bunit.BunitContext.Render[TComponent](RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 169
at Bunit.BunitContext.Render[TComponent](Action`1 parameterBuilder) in /_/src/bunit/BunitContext.cs:line 152
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Components.Audit.AuditDrilldownDrawerTests.CopyAsCurl_InvokesClipboard_WithCurlString() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Components/Audit/AuditDrilldownDrawerTests.cs:line 404
--- End of stack trace from previous location ---
Failed! - Failed: 1, Passed: 34, Skipped: 0, Total: 35, Duration: 206 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,114 @@
[
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/MxGatewayEndpointEditor.razor",
7
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/OpcUaEndpointEditor.razor",
22
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ComposeIntoDialog.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AlarmTriggerEditor.razor",
7
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ScriptTriggerEditor.razor",
4
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AttributeListEditor.razor",
1
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/SchemaBuilder.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
7
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateScriptDialog.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
4
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
4
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
3
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
1
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
1
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
3
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
7
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
6
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
4
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
2
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/CreateAreaDialog.razor",
3
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
5
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
1
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
8
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
9
],
[
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
5
]
]
@@ -0,0 +1,44 @@
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.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.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.
[xUnit.net 00:00:00.30] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Components.Audit.AuditDrilldownDrawerTests.OpenDrawer_HasNamedModalAndEscapeCloses [FAIL]
[xUnit.net 00:00:00.31] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DialogHostShowAsyncTests.Dialog_NamesAndPromptAssociationsFollowCurrentDialog [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Components.Audit.AuditDrilldownDrawerTests.OpenDrawer_HasNamedModalAndEscapeCloses [148 ms]
Error Message:
Bunit.ElementNotFoundException : No elements were found that matches the selector '[role=dialog]'
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.Components.Audit.AuditDrilldownDrawerTests.OpenDrawer_HasNamedModalAndEscapeCloses() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Components/Audit/AuditDrilldownDrawerTests.cs:line 43
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.DialogHostShowAsyncTests.Dialog_NamesAndPromptAssociationsFollowCurrentDialog [160 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DialogHostShowAsyncTests.Dialog_NamesAndPromptAssociationsFollowCurrentDialog() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DialogHostShowAsyncTests.cs:line 44
--- End of stack trace from previous location ---
Failed! - Failed: 2, Passed: 0, Skipped: 0, Total: 2, Duration: 164 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,35 @@
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.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.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.
[xUnit.net 00:00:00.27] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping [140 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/ControlLabelTests.cs:line 18
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed! - Failed: 1, Passed: 0, Skipped: 0, Total: 1, Duration: 147 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,43 @@
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.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.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.
[xUnit.net 00:00:00.26] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping [118 ms]
Error Message:
System.NullReferenceException : Object reference not set to an instance of an object.
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Components.Shared.DataTable`1.BuildRenderTree(RenderTreeBuilder __builder) in /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DataTable.razor:line 46
at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)
--- End of stack trace from previous location ---
at Bunit.Rendering.BunitRenderer.AssertNoUnhandledExceptions() in /_/src/bunit/Rendering/BunitRenderer.cs:line 707
at Bunit.Rendering.BunitRenderer.Render(RenderFragment renderFragment) in /_/src/bunit/Rendering/BunitRenderer.cs:line 597
at Bunit.Rendering.BunitRenderer.RenderFragment(RenderFragment renderFragment) in /_/src/bunit/Rendering/BunitRenderer.cs:line 137
at Bunit.BunitContext.RenderInsideRenderTree(RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 230
at Bunit.BunitContext.RenderInsideRenderTree[TComponent](RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 214
at Bunit.BunitContext.Render[TComponent](RenderFragment renderFragment) in /_/src/bunit/BunitContext.cs:line 169
at Bunit.BunitContext.Render[TComponent](Action`1 parameterBuilder) in /_/src/bunit/BunitContext.cs:line 152
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.ControlLabelTests.TableSearch_HasAssociatedLabelAfterTyping() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/ControlLabelTests.cs:line 13
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed! - Failed: 1, Passed: 0, Skipped: 0, Total: 1, Duration: 125 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,35 @@
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.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.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.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.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.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.33] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Forms.OpcUaEndpointEditorTests.EndpointError_IsDescribedAndInvalidUntilValidationClears [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Forms.OpcUaEndpointEditorTests.EndpointError_IsDescribedAndInvalidUntilValidationClears [179 ms]
Error Message:
Assert.Equal() Failure: Strings differ
Expected: "true"
Actual: null
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Forms.OpcUaEndpointEditorTests.EndpointError_IsDescribedAndInvalidUntilValidationClears() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs:line 32
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed! - Failed: 1, Passed: 0, Skipped: 0, Total: 1, Duration: 186 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,19 @@
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.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.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
/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor(193,33): error RZ10007: The attribute 'aria-label' is used two or more times for this element. Attributes must be unique (case-insensitive). [/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/ZB.MOM.WW.ScadaBridge.CentralUI.csproj]
@@ -0,0 +1,57 @@
TemplatePickerDialog.razor:18 <input type="text" class="form-control" data-test="picker-search" placeholder="Search templates..." value="@_search" @oninput="OnSearchInput" />
MoveFolderDialog.razor:10 <select class="form-select form-select-sm" @bind="_targetParentId">
AlarmTriggerEditor.razor:469 <input type="text" class="form-control form-control-sm" placeholder="Optional operator message for this band…" value="@messa
ScriptTriggerEditor.razor:202 <select class="form-select form-select-sm" @bind="_intervalUnit" @bind:after="OnIntervalChanged">
AttributeListEditor.razor:6 <select>
AttributeListEditor.razor:13 <select>
AttributeListEditor.razor:47 <input type="text" class="form-control font-monospace" value="@Rows[index]" placeholder="@Placeholder()"
AttributeListEditor.razor:79 <select>
SchemaBuilder.razor:107 <input type="text" class="form-control form-control-sm" style="max-width: 14rem;" placeholder="name" @bind="prop.Name" @bind:event="
SchemaBuilder.razor:111 <select class="form-select form-select-sm" style="max-width: 9rem;" @bind="prop.Schema.Type" @bind:after="() =>
SchemaBuilder.razor:122 <select class="form-select form-select-sm" style="max-width: 9rem;" @bind="prop.Schema.Items!.Type" @bind:after="() =>
MoveDataConnectionDialog.razor:17 <select class="form-select form-select-sm" @bind="_targetSiteId">
MoveTemplateDialog.razor:8 <select class="form-select form-select-sm" @bind="_targetFolderId">
TreeView.razor:114 <input type="checkbox" class="form-check-input tv-checkbox @(checkState == CheckState.Indeterminate ? "tv-checkbox-indeterminate" : "")"
RenameFolderDialog.razor:9 <input class="form-control form-control-sm" @bind="_name" @bind:event="oninput" />
NodeBrowserDialog.razor:29 <input class="form-control" data-test="node-search-input" @bind="_searchQuery" @bind:event="oninput"
NodeBrowserDialog.razor:115 <input class="form-control" @bind="_manualNodeId" @bind:event="oninput" placeholder="nsu=&lt;namespace-uri&gt;;s=..." />
TransportImport.razor:365 <select class="form-select form-select-sm" style="max-width: 22rem;" data-
TransportImport.razor:415 <select class="form-select form-select-sm" style="max-width: 22rem;"
TransportImport.razor:495 <input type="text" class="form-control form-control-sm" style="max-width: 14rem;" placeholder="New name"
SharedScripts.razor:42 <input class="form-control form-control-sm" placeholder="Filter by name or code…" @bind="_search" @bind:event="oninput" />
TemplateScriptDialog.razor:84 <select class="form-select" @bind="_minTimeUnit">
TemplateScriptDialog.razor:183 <select class="form-select form-select-sm" @bind="_bindInstance">
TemplateEdit.razor:749 <input class="form-check-input" type="checkbox" role="switch" checked="@attr.LockedInDerived"
TemplateEdit.razor:1217 <input class="form-check-input" type="checkbox" role="switch" checked="@script.LockedInDerived"
DataConnections.razor:59 <input type="text" class="form-control form-control-sm" placeholder="Search sites or connections..." @bind="_searchText" @bind:event
DataConnectionForm.razor:49 <select class="form-select form-select-sm" @bind="_formSiteId">
DataConnectionForm.razor:70 <select class="form-select form-select-sm" @bind="_protocol">
Templates.razor:62 <input type="text" class="form-control form-control-sm" placeholder="Search templates..." value="@_searchText"
ExternalSystems.razor:147 <input class="form-control form-control-sm" placeholder="Filter by name…" @bind="_extsysSearch" @bind:event="oninput" />
ExternalSystems.razor:220 <input class="form-control form-control-sm" placeholder="Filter by name…" @bind="_dbConnSearch" @bind:event="oninput" />
ExternalSystems.razor:293 <input class="form-control form-control-sm" placeholder="Filter by name…" @bind="_apiMethodSearch" @bind:event="oninput" />
Sites.razor:89 <input class="form-control form-control-sm" placeholder="Filter by name or identifier…" @bind="_search" @bind:event="oninput" />
LdapMappings.razor:29 <input class="form-control form-control-sm" placeholder="Filter by name, LDAP group, or role…" @bind="_search" @bind:event="oninput"
ApiKeys.razor:30 <input class="form-control form-control-sm" placeholder="Filter by name…" @bind="_search" @bind:event="oninput" />
Topology.razor:75 <input type="text" class="form-control form-control-sm" style="max-width: 320px;" placeholder="Search loaded sites, areas, instances..."
MoveInstanceDialog.razor:11 <select class="form-select form-select-sm" @bind="_targetAreaId">
InstanceCreate.razor:141 <select class="form-select form-select-sm" style="width: auto;" data-test="create-root-connection" @bind="_rootConnectionId">
InstanceCreate.razor:148 <input class="form-control form-control-sm font-monospace" style="max-width: 260px;" data-test="create-root-object" @bind="_rootObject" pla
InstanceCreate.razor:172 <select class="form-select form-select-sm" style="width: 160px;" data-test="create-group-connection" value="@(input?.ConnectionId ?? 0
InstanceCreate.razor:181 <input class="form-control form-control-sm font-monospace" style="max-width: 260px;" data-test="create-group-object" value="@input?.Obj
InstanceConfigure.razor:177 <select class="form-select form-select-sm" style="width: 160px;" data-test="binding-group-connection" value="@GroupConnectionInput(g)"
InstanceConfigure.razor:186 <input class="form-control form-control-sm font-monospace" style="max-width: 260px;" data-test="binding-group-object" value="@GroupObje
InstanceConfigure.razor:244 <select class="form-select form-select-sm" value="@connId"
InstanceConfigure.razor:255 <input class="form-control form-control-sm font-monospace" value="@GetOverrideForAttr(name)"
InstanceConfigure.razor:410 <input type="text" class="form-control form-control-sm" value="@GetOverrideValue(attr.Name)"
InstanceConfigure.razor:679 <select class="form-select form-select-sm" value="@(_nasConnEdit.GetValueOrDefault(src.Name) ?? "")"
InstanceConfigure.razor:690 <input class="form-control form-control-sm font-monospace" placeholder="@src.SourceReference"
InstanceConfigure.razor:696 <input class="form-control form-control-sm" placeholder="@(string.IsNullOrEmpty(src.ConditionFilter) ? "(all)" : src.Condit
InstanceConfigure.razor:702 <select class="form-select form-select-sm" data-test="@($"nas-mes-{src.Name}")" value="@MesText(_nasMesEdit.GetValueOrDefa
InstanceConfigure.razor:736 <select class="form-select form-select-sm" style="width: auto;" data-test="area-select" @bind="_reassignAreaId">
MoveAreaDialog.razor:11 <select class="form-select form-select-sm" @bind="_targetParentId">
ParkedMessages.razor:193 <input class="form-check-input" type="checkbox" checked="@isSelected" @onchange="e =>
Health.razor:120 <select>
Health.razor:121 <select class="form-select form-select-sm" style="width:auto" data-test="site-health-trends-site" value="@_trendSi
EventLogs.razor:291 <input type="datetime-local">
NotificationReport.razor:787 <input type="datetime-local">
@@ -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.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.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.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.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.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.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.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.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.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.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.
Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb01-03/sb01-03-reviewed.trx
Passed! - Failed: 0, Passed: 1556, Skipped: 0, Total: 1556, Duration: 33 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,8 @@
{
"dialogs": 1,
"drawer": true,
"cancelled": "Cancelled locally",
"afterEscapeDialogs": 0,
"triggerFocused": true,
"unlocked": true
}
@@ -0,0 +1,63 @@
{
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditDrilldownDrawer.razor": "e227e114d2c635c0884644717774e86a1329d22be4b565f5d2a39ac62970f31c",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditDrilldownDrawer.razor.cs": "8b20ae2942ececdb32337904d0fac77e55c4d4cacf5c420502ab5a2bb4d86298",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditFilterBar.razor": "2bcdc0f3aa0515ab8f28a49b2164c0e041747274b19b1ee90707f52e4e43b8ba",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Dialogs/NodeBrowserDialog.razor": "8fef5fd69d12f2e31cbc68f5474eb5f226f7a6f80e7d29e9b09293adc950e519",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/MxGatewayEndpointEditor.razor": "de40d6b4ca2ec6b11d811054206271a09dd2aec85275705108206b3c80f28777",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/OpcUaEndpointEditor.razor": "99aaea03e00e32b5b3a09249bd6c4a4f7a3cc018c89e5232db46f2923e2774a2",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor": "ef53429dfcff262c63f7403b81cf5c3fc2307954aa9da5e28488dd627a4f01fa",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor": "3652d2bed8794b5c30d13c4a4ed57b3c93e71bb5d3421cd2d3f24d8a6b2b0ff3",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor": "d8670af065d622dab9695311aecc8ef3dbfaa8a2e09de09f8701b382f266a907",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor": "fb111ea682cb74b2887e1871d6a5360256b2b1207bcd55b0870c0e06156ef4cd",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor": "59eba49dbad6502e0ff3f4048d3f9237d91b34d2457ec290696e97322e8fa7e6",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor": "6901a47bba7b464908a3c6a31ff3261d981d9cbd93b27b078d7e0e8b2ec0f7a9",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/CreateAreaDialog.razor": "fa14117412ef5e92681a101e914853f2422a3d6507e6ffaf8b9719ba35424d37",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor": "eb3ab54cdc1ce9eba5501f7262b25cd04e2373a3a189dd85a32309c2da5867f4",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor": "10893362d2d5197fd902493bd68b7389a6e01cdd938dfbce634c80a6ad6df66e",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor": "a1d4b8f46d373eed1a14b861783dbc64fdf739ca406301fe7b8d425248f1cb11",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor": "4f95cef86ac362b8eea7da32e4ccc0385c499d5bdfb8e370045fd9c96c6ac9df",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/MoveAreaDialog.razor": "b8b85d377676c3483ecd125502aa3c515046932c1c2c181ad20b4ecbe002f158",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/MoveInstanceDialog.razor": "feec5322422159685fd8ea4721709e244bc9c453efdd26c04a45ee536c7cb9a3",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor": "e3c91d6fc976c86007110ac0a819479f822540cbe365934223450c4835384f0e",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor": "f5d01e91381694cc376b6cb265f39286cf297952c4ba33642b89355e36fe6ed8",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor": "0a289f0889455acb65aead264d48225e7237e20939549844dbc6c925995113af",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor": "12fc2ff8a5c6b744d4c70760fedf6b5f9a43249743b1c18e53ca906cf1c6d0cd",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor": "0234f7945b1e41dd96a0ea7dc0c2fae821b915f7b2a71251eed9f90cf3732020",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor": "0cf833b64e5490856d7181a05e2879621aef493293aeb2f222f3d9bf898b1a13",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor": "f98bc6a6bf4586b927ad5edfe9047fbfe6300fb394ecdbf641398a4524161892",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor": "487267e6bcaa33190b353a1ae77c4cb1fefa12a39c63e2b9a9ddc63c6aa2a4ca",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor": "d9d7d7b13d71e5f59636470663efaf4b300d9d3473523e54af7b27eabae44e70",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor": "a525cb72c6dbcdc6bf705a9da57d8ab36f410c6520c4aedca3409d06d90a2668",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateAlarmDialog.razor": "45b6be53f8341dbf3504a93b3aa6e4e86b4b6cdfead6553988f3de2a887e2cad",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor": "38074169da5d3d8c890d2440eea13e92209d0b62553b083589041d80983ef1da",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor": "a7f5431b2676a46a8dd8426e53229e08af44cc4b3496b9380348e609a977921a",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateScriptDialog.razor": "6c9970bbfa584281036254dd589e676a1793f616d84515cf068f8d359d1092a3",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor": "6f253bc40b8b7fff66257c1e542ce237205cd1c5008219762a32a6f53628665b",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor": "bcdcef9d0ea82e1fe00fa0e5d269aa367908ce594c5b40000f3c9a348df29fd2",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor": "0f2779609ef54edb4304599a2979048c180fe09c421d1926ce6648ecad31a898",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor": "a138d4d53121140f88a8ce9678ae4c9e2185cd659c6d5bc917b3daf85f28ee0b",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor": "0b9a90acdefebabec8635455ef9528ee2584c026f7489f7e7de458c214147671",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor": "6ae1405476bba5c87acb18192340c93ae929075377926eeec6c169c648252839",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor": "72ab4d79c3dd360970333998ffeffbe13943977e27e2b272ede3558644d588ef",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AlarmTriggerEditor.razor": "97cd7f62703deca3d6cddb7a12d4c77d050db1a64dedabdbb0fa82d8649e0f81",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AttributeListEditor.razor": "efd2a47f67187a82ad2b4d0c1324f8b283562f8d3cb1958691179c467a2db1c9",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ComposeIntoDialog.razor": "2af91f3c923c75767827019df77e3da6908ac9094593489d426d502e71897c39",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DataTable.razor": "65deb2f88b520f1c7e809cc0f0021d636166f49c125f8f33a516c44876d592a4",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DialogHost.razor": "6392d8d4eacdd56749eaf5146f93ac53743f39adf7ff7440999811f8f0a56bc1",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveDataConnectionDialog.razor": "21aa5fccf1b82310d45fb5fe19623a1e6946ddb16c7df4f3d0e687e2326405b5",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveFolderDialog.razor": "82cb7bab20b5e3d7660b8d8e56e658037eef8d3cf3bb3aa101566e85169f6d29",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveTemplateDialog.razor": "2b9d29ef921a5996d11d0cbacc13fdb7ee291678da8c8827fa66de0b86bd264e",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MultiSelectDropdown.razor": "7b3a13b67e996b8380703cd0264bf1db3f962017614659ee50aa0bbcc6ca6428",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MultiSelectDropdown.razor.cs": "85bcd2c03d96e695976ddab9e41777f7614e0ac4116ba2cfc13b990635fb4922",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/RenameFolderDialog.razor": "5a9104184180f23e718df8a9866b465fb2cd711064f6a6bdd40ac5506ffe9821",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/SchemaBuilder.razor": "60198cdbaf1e30b76bb56fa6851a756c7685f0d7d1ceb0fc93657a205ca3fe9a",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ScriptTriggerEditor.razor": "1d38e59b03fa37cc9849cca79a0bbe075fbc9f12de34e26b1a1a813d456a00ee",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TemplatePickerDialog.razor": "5415a5cd85df0276a058a33578a998a9fcd143181c9638a0a7dc3825cac16cdc",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor": "b999966362a3e692c9325e0c9b76e590e2ac074550864c3294387293603556cb",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/js/dialog.js": "a3b1db1ef9d2fcb88d3c640f8c3431a325807a0a1570aa6752afd98c0b06855d",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Components/Audit/AuditDrilldownDrawerTests.cs": "00670b669e84161f7995ba58978954d80e34d188cbfb277facdf80266aedc8e5",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs": "778553af9313e01eae482eb509dd0f1d930fd7431c35b916d18c5286c93449ba",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DialogHostShowAsyncTests.cs": "fcfbd97b9e01fa3ff1493e94d6136f8c8cc479441eb55ab25309be4474cb27c7",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/ControlLabelTests.cs": "bc88e1ec88b635379ded223a467b775223fa8686b510c91bd370790b75693e4c",
"infra/tools/ui_consistency_browser.py": "1f39218e01b086ff604ee775e2cabbc30f7c01717ecba0982b3d7b8468bebc5d"
}
@@ -0,0 +1,71 @@
{
"lifecycle-and-dialog-naming": [
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditDrilldownDrawer.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditDrilldownDrawer.razor.cs",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DialogHost.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/js/dialog.js"
],
"native-label-id-and-contextual-control-names": [
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Audit/AuditFilterBar.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Dialogs/NodeBrowserDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/CreateAreaDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/MoveAreaDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/MoveInstanceDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.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/ExternalSystemForm.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.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/SharedScripts.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateAlarmDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateScriptDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.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/Operations/SecuredWrites.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AlarmTriggerEditor.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/AttributeListEditor.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ComposeIntoDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DataTable.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveDataConnectionDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveFolderDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MoveTemplateDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MultiSelectDropdown.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/MultiSelectDropdown.razor.cs",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/RenameFolderDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/SchemaBuilder.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/ScriptTriggerEditor.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TemplatePickerDialog.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor"
],
"validation-error-relationships": [
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/MxGatewayEndpointEditor.razor",
"src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Forms/OpcUaEndpointEditor.razor"
],
"tests": [
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Components/Audit/AuditDrilldownDrawerTests.cs",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Forms/OpcUaEndpointEditorTests.cs",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DialogHostShowAsyncTests.cs",
"tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/ControlLabelTests.cs",
"infra/tools/ui_consistency_browser.py"
]
}
@@ -0,0 +1,7 @@
{
"packageSha256": "995b117b0245577598c91404ed7957c071ebe3413696c8be48b419c9deb1bd5d",
"source": "https://gitea.dohertylan.com/api/packages/dohertj2/nuget/index.json",
"runtimeDllMatchesPackage": true,
"isolatedCache": "/tmp/scadabridge-theme101-packages/zb.mom.ww.theme/1.0.1",
"priorG1History": "Theme 1.0.0 evidence retained unchanged"
}
@@ -0,0 +1,22 @@
Determining projects to restore...
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/ZB.MOM.WW.ScadaBridge.Commons.csproj (in 621 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/ZB.MOM.WW.ScadaBridge.TemplateEngine.csproj (in 1.26 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/ZB.MOM.WW.ScadaBridge.KpiHistory.csproj (in 1.5 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/ZB.MOM.WW.ScadaBridge.DeploymentManager.csproj (in 1.51 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/ZB.MOM.WW.ScadaBridge.Security.csproj (in 183 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/ZB.MOM.WW.ScadaBridge.NotificationService.csproj (in 1.7 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/ZB.MOM.WW.ScadaBridge.HealthMonitoring.csproj (in 1.7 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/ZB.MOM.WW.ScadaBridge.StoreAndForward.csproj (in 1.7 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/ZB.MOM.WW.ScadaBridge.SiteEventLogging.csproj (in 441 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/ZB.MOM.WW.ScadaBridge.NotificationOutbox.csproj (in 191 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.csproj (in 19 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.csproj (in 2.16 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/ZB.MOM.WW.ScadaBridge.AuditLog.csproj (in 380 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/ZB.MOM.WW.ScadaBridge.Transport.csproj (in 2.16 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/ZB.MOM.WW.ScadaBridge.InboundAPI.csproj (in 2.16 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/ZB.MOM.WW.ScadaBridge.ManagementService.csproj (in 2.16 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.csproj (in 401 ms).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/ZB.MOM.WW.ScadaBridge.CentralUI.csproj (in 2.16 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.csproj (in 1.53 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.csproj (in 2.17 sec).
Restored /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/ZB.MOM.WW.ScadaBridge.Communication.csproj (in 2.33 sec).
@@ -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.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.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.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.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.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.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.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.
Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb01-03/sb01-03-theme101.trx
Passed! - Failed: 0, Passed: 1557, Skipped: 0, Total: 1557, Duration: 33 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,35 @@
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.
[xUnit.net 00:00:00.30] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TreeViewMultiSelectTests.CheckboxNames_ReferenceVisibleNodeAndRemainUniqueAcrossTrees [FAIL]
Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TreeViewMultiSelectTests.CheckboxNames_ReferenceVisibleNodeAndRemainUniqueAcrossTrees [151 ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TreeViewMultiSelectTests.CheckboxNames_ReferenceVisibleNodeAndRemainUniqueAcrossTrees() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TreeViewMultiSelectTests.cs:line 76
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Failed! - Failed: 1, Passed: 0, Skipped: 0, Total: 1, Duration: 158 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
@@ -0,0 +1,30 @@
[
{
"state": "disabled",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "hidden",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "unfocusable",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "disconnected",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
}
]
@@ -0,0 +1,30 @@
[
{
"state": "disabled",
"heading": false,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "hidden",
"heading": false,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "unfocusable",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
},
{
"state": "disconnected",
"heading": true,
"locked": false,
"inert": false,
"cleaned": true
}
]
+16
View File
@@ -0,0 +1,16 @@
"""Focused native lifecycle regression against the actual local overlay script."""
import argparse,json
from pathlib import Path
from playwright.sync_api import sync_playwright
args=argparse.ArgumentParser();args.add_argument('--output',required=True);opts=args.parse_args()
script=Path('src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/js/dialog.js').read_text();results=[]
with sync_playwright() as p:
browser=p.chromium.launch(channel='chromium')
for state in ['disabled','hidden','unfocusable','disconnected']:
page=browser.new_page();page.set_content('<main><h1>Stable heading</h1><button id="trigger">Open</button><button id="next">Next</button></main><section id="dialog" tabindex="-1"><button>Close</button></section>');page.add_script_tag(content=script);
if state=='unfocusable':page.evaluate('()=>{const span=document.createElement("span");span.id="trigger";span.tabIndex=0;span.textContent="Open";document.querySelector("#trigger").replaceWith(span)}')
page.focus('#trigger');page.evaluate('sbDialog.activate("dialog")');page.evaluate('''s=>{const t=document.querySelector('#trigger');if(s==='disabled')t.disabled=true;if(s==='hidden')t.hidden=true;if(s==='unfocusable')t.removeAttribute('tabindex');if(s==='disconnected')t.remove();document.querySelector('#dialog').remove();}''',state);page.wait_for_timeout(30)
result=page.evaluate('({heading:document.activeElement===document.querySelector("h1"),locked:document.body.classList.contains("modal-open"),inert:!!document.querySelector("[inert]")})');page.focus('#next');result['cleaned']=page.get_attribute('h1','tabindex') is None;results.append({'state':state,**result});page.close()
browser.close()
Path(opts.output).write_text(json.dumps(results,indent=2)+'\n');print(results)
raise SystemExit(0 if all(r['heading'] and not r['locked'] and not r['inert'] and r['cleaned'] for r in results) else 1)
+33
View File
@@ -0,0 +1,33 @@
"""Bounded loopback fixture overlay check. Does not submit application writes."""
import argparse,json
from pathlib import Path
from urllib.parse import urlparse
from playwright.sync_api import sync_playwright
parser=argparse.ArgumentParser();parser.add_argument('--base-url',required=True);parser.add_argument('--storage-state');parser.add_argument('--output-dir',required=True);parser.add_argument('--case',default='overlays');args=parser.parse_args()
if urlparse(args.base_url).hostname not in ('127.0.0.1','localhost'):raise SystemExit('This synthetic fixture harness accepts loopback origins only.')
out=Path(args.output_dir);out.mkdir(parents=True,exist_ok=True);results=[]
with sync_playwright() as p:
browser=p.chromium.launch(channel='chromium',headless=True)
for width in (1440,390):
context=browser.new_context(viewport={'width':width,'height':1000},reduced_motion='reduce',**({'storage_state':args.storage_state} if args.storage_state else {}));page=context.new_page();page.goto(args.base_url+'/overlays',wait_until='networkidle')
for kind in ('confirm','prompt','drawer'):
trigger='#open-'+kind;page.locator(trigger).click();dialog=page.locator('[role=dialog]');dialog.wait_for();page.wait_for_function('document.body.classList.contains("modal-open")')
record={'width':width,'kind':kind,'title':dialog.get_attribute('aria-labelledby'),'checks':{}}
record['checks']['name']=bool(record['title']) and bool(page.locator('#'+record['title']).inner_text())
if kind=='prompt':record['checks']['promptLabel']=dialog.locator('label').get_attribute('for')==dialog.locator('input').get_attribute('id')
# Hidden/disabled descendants do not become keyboard boundaries.
dialog.evaluate('e=>{let b=document.createElement("button");b.hidden=true;b.textContent="Hidden sample";e.append(b);let d=document.createElement("button");d.disabled=true;d.textContent="Disabled sample";e.append(d)}')
selectors='a[href],button,input,select,textarea,[tabindex]'
items=dialog.locator(selectors).all();items=[i for i in items if i.is_visible() and i.is_enabled() and int(i.get_attribute('tabindex') or '0')>=0]
items[-1].focus();page.keyboard.press('Tab');record['checks']['lastWraps']=items[0].evaluate('e=>e===document.activeElement')
items[0].focus();page.keyboard.press('Shift+Tab');record['checks']['firstWraps']=items[-1].evaluate('e=>e===document.activeElement')
record['checks']['backgroundInert']=page.locator(trigger).evaluate('e=>!!e.closest("[inert]")')
page.screenshot(path=str(out/f'{kind}-{width}.png'),full_page=True)
page.keyboard.press('Escape');dialog.wait_for(state='detached');record['checks']['restored']=page.locator(trigger).evaluate('e=>e===document.activeElement');record['checks']['unlocked']=page.evaluate('!document.body.classList.contains("modal-open") && !document.querySelector("[inert]")')
# Repeat opening and disconnected-trigger fallback; no server write involved.
page.locator(trigger).click();dialog.wait_for();page.wait_for_function('document.body.classList.contains("modal-open")');page.locator(trigger).evaluate('e=>e.remove()');page.keyboard.press('Escape');dialog.wait_for(state='detached');record['checks']['disconnectedFallback']=page.locator('h1').evaluate('e=>e===document.activeElement')
results.append(record);page.reload(wait_until='networkidle')
# Real host lifecycle with temporarily nonfocusable descendants.
page.locator('#open-confirm').click();dialog=page.locator('[role=dialog]');dialog.wait_for();page.wait_for_function('document.body.classList.contains("modal-open")');dialog.locator('button').evaluate_all('xs=>xs.forEach(e=>e.disabled=true)');dialog.focus();page.keyboard.press('Tab');results.append({'width':width,'kind':'no-focusable','checks':{'contained':dialog.evaluate('e=>e===document.activeElement')}});page.keyboard.press('Escape');dialog.wait_for(state='detached');context.close()
browser.close()
(out/'overlays.json').write_text(json.dumps({'results':results,'passed':all(all(r['checks'].values()) for r in results)},indent=2)+'\n');print('Passed',sum(all(r['checks'].values()) for r in results),'/',len(results))
@@ -1,3 +1,5 @@
@implements IAsyncDisposable
@inject IJSRuntime JS
@using ZB.MOM.WW.ScadaBridge.CentralUI.Services
@using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums
@@ -11,14 +13,15 @@
{
<div class="offcanvas-backdrop fade show" data-test="drawer-backdrop"
@onclick="HandleClose"></div>
<div class="offcanvas offcanvas-end show audit-drilldown-drawer"
<div id="@_overlayId" role="dialog" aria-modal="true" aria-labelledby="@(_overlayId + "-title")"
@onkeydown="HandleKeyDown" class="offcanvas offcanvas-end show audit-drilldown-drawer"
tabindex="-1"
style="visibility: visible;"
data-test="audit-drilldown-drawer">
<div class="offcanvas-header border-bottom">
<div>
<div class="text-muted small text-uppercase">Audit event</div>
<h5 class="offcanvas-title mb-0">Audit Event @ShortEventId(Event.EventId)</h5>
<h5 id="@(_overlayId + "-title")" class="offcanvas-title mb-0">Audit Event @ShortEventId(Event.EventId)</h5>
</div>
<button type="button" class="btn-close" aria-label="Close"
data-test="drawer-close"
@@ -1,3 +1,4 @@
using Microsoft.JSInterop;
using Microsoft.AspNetCore.Components;
using ZB.MOM.WW.ScadaBridge.CentralUI.Services;
@@ -36,6 +37,39 @@ public partial class AuditDrilldownDrawer
/// </summary>
[Parameter] public EventCallback OnClose { get; set; }
private readonly string _overlayId = "sb-audit-drawer-" + Guid.NewGuid().ToString("N");
private bool _activated;
/// <inheritdoc />
protected override async Task OnAfterRenderAsync(bool firstRender)
{
var visible = IsOpen && Event is not null;
if (visible == _activated) return;
_activated = visible;
try
{
if (visible)
{
var activated = await JS.InvokeAsync<bool?>("sbDialog.activate", _overlayId);
if (activated == false) await HandleClose();
}
else await JS.InvokeVoidAsync("sbDialog.deactivate", _overlayId);
}
catch (Microsoft.JSInterop.JSDisconnectedException) { }
catch (InvalidOperationException) { /* prerender */ }
}
/// <inheritdoc />
public async ValueTask DisposeAsync()
{
try { await JS.InvokeVoidAsync("sbDialog.deactivate", _overlayId); }
catch (Microsoft.JSInterop.JSDisconnectedException) { }
catch (InvalidOperationException) { /* prerender */ }
}
private Task HandleKeyDown(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs e) =>
e.Key == "Escape" ? HandleClose() : Task.CompletedTask;
private static string ShortEventId(Guid eventId)
{
// Mirror the "first 8 hex digits" presentation common across the UI.
@@ -2,7 +2,7 @@
Listens to DialogService.OnChange and renders the current dialog state.
z-index ladder follows the same convention as ConfirmDialog/DiffDialog:
Toast container 1090 > this modal 1055 > this backdrop 1040. *@
@implements IDisposable
@implements IAsyncDisposable
@inject IDialogService Service
@inject IJSRuntime JS
@@ -11,22 +11,24 @@
@* `sb-modal-backdrop` is a tokenized hook: a separate task attaches the
var-driven background rule to it. No inline style here. *@
<div class="modal-backdrop fade show sb-modal-backdrop"></div>
<div @ref="_modalRef"
<div id="@_overlayId" @ref="_modalRef"
class="modal fade show d-block"
tabindex="-1"
role="dialog"
aria-modal="true"
aria-labelledby="@TitleId"
aria-describedby="@(state.Kind == DialogKind.Confirm ? BodyId : null)"
@onkeydown="OnKeyDown">
<div class="modal-dialog modal-dialog-centered@(state.Size is null ? "" : $" {state.Size}")" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">@state.Title</h5>
<h5 id="@TitleId" class="modal-title">@state.Title</h5>
<button type="button" class="btn-close" aria-label="Close" @onclick="Cancel"></button>
</div>
<div class="modal-body">
@if (state.Kind == DialogKind.Confirm)
{
<p class="mb-0">@state.Body</p>
<p id="@BodyId" class="mb-0">@state.Body</p>
}
else if (state.Kind == DialogKind.Custom)
{
@@ -34,8 +36,8 @@
}
else
{
<label class="form-label">@state.Body</label>
<input @ref="_promptInputRef"
<label for="@PromptId" class="form-label">@state.Body</label>
<input id="@PromptId" @ref="_promptInputRef"
class="form-control form-control-sm"
placeholder="@state.Placeholder"
value="@_promptValue"
@@ -63,6 +65,10 @@
}
@code {
private readonly string _overlayId = "sb-dialog-" + Guid.NewGuid().ToString("N");
private string TitleId => _overlayId + "-title";
private string BodyId => _overlayId + "-body";
private string PromptId => _overlayId + "-prompt";
private ElementReference _modalRef;
private ElementReference _promptInputRef;
private string _promptValue = string.Empty;
@@ -77,9 +83,13 @@
if (Service is DialogService svc) svc.OnChange += OnServiceChanged;
}
public void Dispose()
public async ValueTask DisposeAsync()
{
if (Service is DialogService svc) svc.OnChange -= OnServiceChanged;
Cancel(); // A disposed host must not leave its local dialog result pending.
try { await JS.InvokeVoidAsync("sbDialog.deactivate", _overlayId); }
catch (JSDisconnectedException) { }
catch (InvalidOperationException) { /* prerender */ }
}
private void OnServiceChanged()
@@ -97,67 +107,32 @@
protected override async Task OnAfterRenderAsync(bool firstRender)
{
var current = (Service as DialogService)?.Current;
if (current is not null)
if (current is not null && !ReferenceEquals(current, _focusedForState))
{
try { await JS.InvokeVoidAsync("document.body.classList.add", "modal-open"); }
catch { /* prerender: no JS — ignore */ }
// Focus once per opened dialog. Without this guard, every input
// keystroke triggers a re-render which would re-focus the modal
// element and yank the caret off the prompt input.
if (!ReferenceEquals(current, _focusedForState))
_focusedForState = current;
try
{
_focusedForState = current;
// Stash the element that had focus when the dialog opened so it
// can be restored on close. Must run BEFORE the modal steals
// focus below, otherwise we'd capture a modal element.
try { await JS.InvokeVoidAsync("sbDialog.captureActiveElement"); }
catch { /* prerender: no JS — ignore */ }
try
{
if (current.Kind == DialogKind.Prompt)
await _promptInputRef.FocusAsync();
else
await _modalRef.FocusAsync();
}
catch { /* element not yet attached: ignore */ }
var activated = await JS.InvokeAsync<bool?>("sbDialog.activate", _overlayId,
current.Kind == DialogKind.Prompt ? "#" + PromptId : null);
if (activated == false) Cancel(); // Single-active-overlay contract.
}
catch (JSDisconnectedException) { }
catch (InvalidOperationException) { /* prerender */ }
}
else
else if (current is null && _focusedForState is not null)
{
// Only clean up on the actual open→closed transition. Skipping when
// _focusedForState is already null avoids spurious JS interop on
// the initial render and every steady-state no-dialog render.
if (_focusedForState is not null)
{
_focusedForState = null;
try { await JS.InvokeVoidAsync("document.body.classList.remove", "modal-open"); }
catch { /* prerender: no JS — ignore */ }
// Return focus to whatever element triggered the dialog so keyboard
// users are not dumped at the top of the document on close.
try { await JS.InvokeVoidAsync("sbDialog.restoreActiveElement"); }
catch { /* prerender: no JS — ignore */ }
}
_focusedForState = null;
try { await JS.InvokeVoidAsync("sbDialog.deactivate", _overlayId); }
catch (JSDisconnectedException) { }
catch (InvalidOperationException) { /* prerender */ }
}
}
private async Task OnKeyDown(KeyboardEventArgs e)
private void OnKeyDown(KeyboardEventArgs e)
{
if (e.Key == "Escape")
{
Cancel();
}
else if (e.Key == "Tab")
{
// Trap Tab/Shift+Tab inside the modal so focus cannot escape to the
// (inert) page behind the backdrop. The JS helper wraps focus at the
// first/last focusable element and prevents the default move there.
try { await JS.InvokeVoidAsync("sbDialog.focusTrap", _modalRef, e.ShiftKey); }
catch { /* prerender / no JS: skip — native Tab order still applies */ }
}
// Native DOM keydown owns synchronous Tab containment; Escape retains
// the service's existing typed cancellation path.
if (e.Key == "Escape") Cancel();
}
private void OnPromptInput(ChangeEventArgs e)
@@ -1,63 +1,88 @@
// Focus management helpers for the centralised DialogHost (T33a). Small and
// dependency-free: capture/restore the trigger element's focus across a modal's
// lifetime, and trap Tab focus inside an open modal. Blazor calls these via
// JS interop (window.sbDialog.*); they are no-ops when there is nothing to act
// on, so prerender / loose-mode test calls do no harm.
// Local overlay pilot: synchronous native Tab handling and per-instance cleanup.
// Generic extraction waits for a second consumer. No dependency on window.event.
(function () {
'use strict';
// CSS selector for elements that can receive keyboard focus within the modal.
const FOCUSABLE =
"a[href],button:not([disabled]),input:not([disabled])," +
"select:not([disabled]),textarea:not([disabled])," +
"[tabindex]:not([tabindex='-1'])";
// The element that had focus when the most recent dialog opened. Module-level
// so it survives between the capture (on open) and restore (on close) calls.
let savedActiveElement = null;
window.sbDialog = {
// Stash the currently focused element so it can be restored on close.
// Called BEFORE the modal steals focus.
captureActiveElement: function () {
savedActiveElement = document.activeElement;
},
// Return focus to the stashed element if it is still in the document,
// then clear the stash so a later dialog starts fresh.
restoreActiveElement: function () {
const el = savedActiveElement;
savedActiveElement = null;
if (el && typeof el.focus === 'function' && el.isConnected) {
el.focus();
}
},
// Cycle focus within the modal: at the first focusable element a
// Shift+Tab wraps to the last; at the last a Tab wraps to the first. In
// both cases the default browser move (which would leave the modal) is
// prevented. Anywhere else, the native Tab order applies untouched.
focusTrap: function (modalEl, shiftKey) {
if (!modalEl) return;
const focusable = modalEl.querySelectorAll(FOCUSABLE);
if (focusable.length === 0) return;
const first = focusable[0];
const last = focusable[focusable.length - 1];
const active = document.activeElement;
// Blazor interop does not hand us the DOM event, but window.event is
// populated during the synchronous keydown dispatch on the engines we
// target — guard the preventDefault so the wrap still works if it is
// ever absent (the explicit .focus() override is the real trap).
const evt = window.event;
if (shiftKey && active === first) {
last.focus();
if (evt) evt.preventDefault();
} else if (!shiftKey && active === last) {
first.focus();
if (evt) evt.preventDefault();
const selector = 'a[href],button,input,select,textarea,[tabindex]';
const states = new Map();
const inertLocks = new Map();
let hadModalOpen = false;
function focusable(root) {
return Array.from(root.querySelectorAll(selector)).filter(el =>
el.tabIndex >= 0 && !el.matches(':disabled') && !el.closest('[inert],[hidden]') &&
el.getClientRects().length > 0 && getComputedStyle(el).visibility !== 'hidden');
}
function lock(el) {
const old = inertLocks.get(el);
if (old) old.count++;
else { inertLocks.set(el, { count: 1, previous: el.inert }); el.inert = true; }
}
function unlock(el) {
const old = inertLocks.get(el);
if (!old || --old.count) return;
el.inert = old.previous; inertLocks.delete(el);
}
function deactivate(id) {
const state = states.get(id);
if (!state) return;
const wasTop = Array.from(states.keys()).at(-1) === id;
states.delete(id);
state.el.removeEventListener('keydown', state.keydown);
state.locked.forEach(unlock);
if (!states.size && !hadModalOpen) document.body.classList.remove('modal-open');
if (!wasTop) return;
if (state.trigger?.isConnected && !state.trigger.closest('[inert]')) state.trigger.focus();
// A connected trigger may now be disabled, hidden, or unfocusable.
// Verify the browser accepted focus rather than trusting connectivity.
if (document.activeElement !== state.trigger) {
const fallback = document.querySelector('main h1,.page h1') || document.querySelector('main,.page');
if (fallback) {
const previous = fallback.getAttribute('tabindex');
fallback.setAttribute('tabindex', '-1'); fallback.focus();
// Removing tabindex immediately blurs an otherwise nonfocusable
// heading in Chromium. Restore its markup only after focus leaves.
if (previous === null) fallback.addEventListener('blur', () => fallback.removeAttribute('tabindex'), { once: true });
else fallback.setAttribute('tabindex', previous);
}
}
};
}
function activate(id, initialSelector) {
const el = document.getElementById(id);
if (!el) return false;
if (states.has(id)) return true;
// One active overlay is supported. Reject sibling and descendant opens;
// callers cancel the rejected presentation through existing close paths.
if (states.size || el.closest('[inert]')) return false;
if (!states.size) hadModalOpen = document.body.classList.contains('modal-open');
const state = { el, trigger: document.activeElement, locked: [] };
// Inert siblings along the ancestor path, never the dialog or its host.
for (let node = el; node.parentElement; node = node.parentElement) {
for (const sibling of node.parentElement.children) {
if (sibling === node || sibling.matches('script,style,link,.modal-backdrop,.offcanvas-backdrop')) continue;
lock(sibling); state.locked.push(sibling);
}
if (node.parentElement === document.body) break;
}
state.keydown = event => {
if (Array.from(states.keys()).at(-1) !== id) return;
if (event.key === 'Escape') event.preventDefault(); // Blazor retains cancellation semantics.
if (event.key !== 'Tab') return;
const items = focusable(el);
const first = items[0], last = items.at(-1), active = document.activeElement;
if (!items.length) { event.preventDefault(); el.focus(); }
else if (event.shiftKey && (active === first || !items.includes(active))) {
event.preventDefault(); last.focus();
} else if (!event.shiftKey && (active === last || !items.includes(active))) {
event.preventDefault(); first.focus();
}
};
states.set(id, state); el.addEventListener('keydown', state.keydown);
document.body.classList.add('modal-open');
const initial = initialSelector ? el.querySelector(initialSelector) : null;
(initial || el).focus();
return true;
}
new MutationObserver(() => {
for (const [id, state] of states) if (!state.el.isConnected) deactivate(id);
}).observe(document.documentElement, { childList: true, subtree: true });
window.sbDialog = { activate, deactivate };
})();
@@ -33,6 +33,21 @@ public class AuditDrilldownDrawerTests : BunitContext
JSInterop.Mode = JSRuntimeMode.Loose;
}
/// <summary>The drawer has modal semantics and Escape dispatches close once.</summary>
[Fact]
public void OpenDrawer_HasNamedModalAndEscapeCloses()
{
var closes = 0;
var cut = Render<AuditDrilldownDrawer>(p => p.Add(c => c.Event, MakeEvent())
.Add(c => c.IsOpen, true).Add(c => c.OnClose, () => closes++));
var dialog = cut.Find("[role=dialog]");
Assert.Equal("true", dialog.GetAttribute("aria-modal"));
var titleId = dialog.GetAttribute("aria-labelledby");
Assert.Contains("Audit Event", cut.Find("#" + titleId).TextContent);
dialog.KeyDown(new Microsoft.AspNetCore.Components.Web.KeyboardEventArgs { Key = "Escape" });
Assert.Equal(1, closes);
}
private static AuditEventView MakeEvent(
AuditChannel channel = AuditChannel.ApiOutbound,
AuditKind kind = AuditKind.ApiCall,
@@ -372,6 +387,8 @@ public class AuditDrilldownDrawerTests : BunitContext
{
// Set up Strict mode interop so the call must match exactly.
JSInterop.Mode = JSRuntimeMode.Strict;
JSInterop.Setup<bool?>("sbDialog.activate", _ => true).SetResult(true);
JSInterop.SetupVoid("sbDialog.deactivate", _ => true).SetVoidResult();
var clipboardCall = JSInterop.SetupVoid(
"navigator.clipboard.writeText",
invocation => invocation.Arguments.Count == 1
@@ -33,6 +33,46 @@ public class DialogHostShowAsyncTests : BunitContext
JSInterop.Mode = JSRuntimeMode.Loose;
}
/// <summary>Unsupported overlapping presentation cancels safely; disposal resolves pending callers.</summary>
[Fact]
public async Task RejectedOverlayAndDisposal_ResolvePendingResults()
{
JSInterop.Setup<bool?>("sbDialog.activate", _ => true).SetResult(false);
var cut = Render<DialogHost>();
Task<bool> pending = null!;
await cut.InvokeAsync(() => { pending = _service.ConfirmAsync("Rejected", "Local only"); });
cut.WaitForAssertion(() => Assert.Null(_service.Current));
Assert.False(await pending);
JSInterop.Setup<bool?>("sbDialog.activate", _ => true).SetResult(true);
await cut.InvokeAsync(() => { pending = _service.ConfirmAsync("Open", "Local only"); });
await cut.InvokeAsync(async () => await cut.Instance.DisposeAsync());
Assert.False(await pending);
Assert.Null(_service.Current);
}
/// <summary>Names successive dialogs and connects prompt labels without stale descriptions.</summary>
[Fact]
public async Task Dialog_NamesAndPromptAssociationsFollowCurrentDialog()
{
var cut = Render<DialogHost>();
await cut.InvokeAsync(() => { _ = _service.ConfirmAsync("First title", "First body"); });
var first = cut.Find("[role=dialog]");
var titleId = first.GetAttribute("aria-labelledby");
Assert.False(string.IsNullOrWhiteSpace(titleId));
Assert.Equal("First title", cut.Find("#" + titleId).TextContent);
var descriptionId = first.GetAttribute("aria-describedby");
Assert.Equal("First body", cut.Find("#" + descriptionId).TextContent);
await cut.InvokeAsync(() => cut.Find("button.btn-close").Click());
await cut.InvokeAsync(() => { _ = _service.PromptAsync("Second title", "Enter a value"); });
var prompt = cut.Find("[role=dialog]");
Assert.Equal("Second title", cut.Find("#" + prompt.GetAttribute("aria-labelledby")).TextContent);
var input = cut.Find("input");
Assert.Equal(input.Id, cut.Find("label").GetAttribute("for"));
Assert.False(string.IsNullOrWhiteSpace(input.Id));
Assert.DoesNotContain("First body", cut.Markup);
await cut.InvokeAsync(() => cut.Find("button.btn-close").Click());
}
/// <summary>Verifies that ShowAsync renders a custom body and resolves the typed result.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]