diff --git a/docs/ui-consistency/ScadaBridge-verification.md b/docs/ui-consistency/ScadaBridge-verification.md index 48d82179..a09a2a36 100644 --- a/docs/ui-consistency/ScadaBridge-verification.md +++ b/docs/ui-consistency/ScadaBridge-verification.md @@ -115,3 +115,19 @@ The broad presentation fixture initially used a hyphenated value that could wrap The reduced-motion matrix alone did not cover two existing opacity paths: pending pills faded to0.6 mid-animation, and predicted ghost groups faded all labels to0.45. Focused actual before proof is pending-motion-before.json and ghost-opacity-before.json (the fixture now supplies a real PredictedFlow overlay). The decorative pending fade is removed; ghost text stays opaque while its existing dashed shape/tinted fill still conveys prediction. No state mapping, edge math, poll or callback change. Focused after proof covers light/dark × normal/reduced motion, four cases: pending opacity1/no animation, ghost group opacity1, and actual title/caption/pill text contrast at least4.5:1. The SVG ghost-background calculation composites its actual fill opacity over the actual alternate lane and wrap surfaces, rather than ignoring ancestor opacity. Existing FlowGraph/FlowDebugger/FlowTrace semantics118/118 tests pass (flow-opacity-focused.log). This is a narrow readability correction after the reduced-motion matrix, not a third broad screenshot review. Last full functional baseline remains1582/1582 with only these CSS opacity changes following it. + +## SB10–12: policy shortcuts, observation summaries and topology composition + +SB07–09 reviewed source/evidence was committed as `0c41b613`. This next batch is isolated to Dashboard/Health/Topology, TreeView scoped CSS, site.css, and DashboardStateTests/HealthPageTests, plus read-only fixture tooling and evidence. + +- **SB10:** Dashboard shortcuts evaluate the exact `RequireDesign` and `OperationalAudit` policies used by the destination routes and rail. Health stays authenticated-only. Real-policy tests distinguish Viewer, Designer, Deployer, Administrator-only, unmapped and expanded multi-role principals. Administrator-only does not satisfy current RequireDesign; no role mapping or route policy was broadened. The initial test premise that it did was corrected transparently; raw failing logs remain. Six actual synthetic principal checks across the suite and four browser rail/shortcut comparisons cover these distinctions. +- **SB11:** Dashboard's four independent configured facts use shared aggregate geometry in a compact four/two/one-column composition; count-loading/failure/retry/single-flight behavior is unchanged. Health exposes online/offline/latest-interval-errors/unknown-metrics facts before its existing KPI groups. Site cards prioritize known offline observations, existing stale/backlog/reconciler/mirror/rejected-row/latest-interval conditions, missing reports, then remaining observations, with display-name and ordinal-id tie-breakers. This is presentation ordering, not a new fleet health aggregation or guarantee of healthy state. Heartbeat-only sites keep known Online liveness and explicitly say Metrics unknown. Script/alarm/dead-letter counters are atomically reset by SiteHealthCollector, so the former active-errors caption now says errors in last report interval; cumulative event-log failure badges and all existing failover/KPI/polling semantics remain unchanged. Native narrow inspection found the existing trend-window group extending to452px at390px; wrapping its existing header containers corrected it without changing query handlers. +- **SB12:** Topology no longer subtracts a guessed240px from viewport height. On narrow/short screens its tree follows document flow; roomy desktop uses actual flex available space and dvh-compatible height with a usable minimum tree region. Coarse pointers receive44px expand/content/button regions and always-visible existing row menus, while fine-pointer density and all lazy-loading, selection, search qualification, paging and poll/concurrency handlers remain unchanged. Its scope remains loaded sites/areas/instances. Checkbox-mode input semantics are unchanged; this batch does not claim a44px checkbox-input target across every TreeView consumer. + +Validation: red-policy-health.log retains six intended preimplementation failures. Additional retained logs show the missing Razor using, real-auth fixture correction (bUnit's preexisting test cascade had masked the registered provider), and mistaken Administrator-only expectation; none was hidden or resolved by weakening authorization. The final focused behavior run passed101/101; full suite passed1591/1591, zero skipped/failed, in sb10-12-final.trx. Only the subsequent Health wrapping classes changed after that full run; final-wrap-focused.log passed101/101. No package dependency or backend model changed in this batch. + +Browser acceptance is summarized explicitly in evidence/sb10-12/acceptance.json:22 accepted cases combine actual light/dark topology+Health at1440/768-short/390/real200% (720 CSS pixels/DPR2), four real-policy rail/shortcut fixtures, and two verified coarse contexts. Loaded topology includes12 synthetic sites ×6 areas, deliberately long names, actual lazy Load instances→Page1, existing loaded-search wording and native keyboard navigation. Health shows offline→warning→unknown→healthy ordering with unknown separated from known liveness. All accepted document widths fit; focus remains reachable after native smooth scrolling settles; coarse expand regions measure44×44px and rows≥44px. Mobile dark Health and touch screenshots were visually inspected. + +The first pass stopped at missing fixture-only AuthorizedManualFailoverService DI before Health could render. After adding the real authorization wrapper over a rejecting synthetic backend, the retained initial22-case JSON recorded19 passes, including requested dark cases that actually stayed light and a false coarse context; those do not establish dark/touch acceptance. Final broad progress20 contains actual light/dark measurements but stopped awaiting coarse initialization. Its six immediate End-key geometry failures were measured before Bootstrap's existing smooth document scroll settled (timing proof retained). Focused confirmation waits for the actual last treeitem and viewport geometry, passing6/6 without keyboard source changes; two additional contexts explicitly verify CDP native touch emulation (maxTouchPoints1, pointer:coarse) and pass2/2. Raw failures, progress, scripts and corrected measurements remain separate; no all-first-pass-success claim is made. + +The disposable localhost5201 host renders actual components/real policies with synthetic roles and rejecting read-only adapters. It has no database, fleet/actor system, LDAP or COM connection and is not complete application authorization/route acceptance. G1 historical evidence is unchanged. SB00 remains pending the published shared Secrets.Ui1.0.1 contrast patch and complete consumer baseline; no local undefined-token alias or caption override was introduced. No deployment or production name inventory was performed. diff --git a/docs/ui-consistency/evidence/sb10-12/acceptance.json b/docs/ui-consistency/evidence/sb10-12/acceptance.json new file mode 100644 index 00000000..1a443162 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/acceptance.json @@ -0,0 +1,259 @@ +{ + "cases": 22, + "passed": 22, + "records": [ + { + "kind": "topology", + "scheme": "light", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "topology", + "scheme": "light", + "requested": [ + 768, + 480 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "topology", + "scheme": "light", + "requested": [ + 390, + 844 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "topology", + "scheme": "light", + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "topology", + "scheme": "dark", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "topology", + "scheme": "dark", + "requested": [ + 768, + 480 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "topology", + "scheme": "dark", + "requested": [ + 390, + 844 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "topology", + "scheme": "dark", + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "passed": true, + "source": "browser-final/progress.json + focused-keyboard-touch-confirmation.json", + "supersedes": "immediate pre-scroll focus geometry" + }, + { + "kind": "health", + "scheme": "light", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "light", + "role": null, + "requested": [ + 768, + 480 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "light", + "role": null, + "requested": [ + 390, + 844 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "light", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "dark", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "dark", + "role": null, + "requested": [ + 768, + 480 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "dark", + "role": null, + "requested": [ + 390, + 844 + ], + "zoom": 1, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "health", + "scheme": "dark", + "role": null, + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "policy", + "scheme": null, + "role": "Viewer", + "requested": null, + "zoom": null, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "policy", + "scheme": null, + "role": "Designer", + "requested": null, + "zoom": null, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "policy", + "scheme": null, + "role": "Deployer", + "requested": null, + "zoom": null, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "policy", + "scheme": null, + "role": "Administrator,Designer,Deployer", + "requested": null, + "zoom": null, + "passed": true, + "source": "browser-final/progress.json" + }, + { + "kind": "touch", + "requested": [ + 390, + 844 + ], + "passed": true, + "source": "focused-keyboard-touch-confirmation.json" + }, + { + "kind": "touch", + "requested": [ + 768, + 480 + ], + "passed": true, + "source": "focused-keyboard-touch-confirmation.json" + } + ], + "limitations": [ + "Synthetic actual-component host; not complete application auth/route baseline", + "First interrupted run failed missing fixture DI; initial22-case JSON19passes includes actual-light dark requests and unverified touch, not accepted dark/touch proof", + "Final broad pass interrupted waiting for falsely requested touch; raw progress20 records retained", + "Six immediate keyboard geometry failures superseded by focused settled native-scroll measurements; no source keyboard behavior changed", + "No production scan, fleet queries, deployments, LDAP, COM or database writes" + ] +} \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/binding-preservation.json b/docs/ui-consistency/evidence/sb10-12/binding-preservation.json new file mode 100644 index 00000000..11f5bad0 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/binding-preservation.json @@ -0,0 +1,17 @@ +[ + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor", + "eventAndBindingExpressionsPreserved": true, + "routeAuthorizeAttributesPreserved": true + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor", + "eventAndBindingExpressionsPreserved": true, + "routeAuthorizeAttributesPreserved": true + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor", + "eventAndBindingExpressionsPreserved": true, + "routeAuthorizeAttributesPreserved": true + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/browser-confirmation.log b/docs/ui-consistency/evidence/sb10-12/browser-confirmation.log new file mode 100644 index 00000000..0c47cbc7 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-confirmation.log @@ -0,0 +1,116 @@ +{ + "cases": 22, + "passed": 19, + "failures": [ + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 390, + "document": 390, + "coarse": false, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "toggles": [ + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + } + ], + "overflow": "visible", + "kind": "touch", + "requested": [ + 390, + 844 + ], + "passed": false + } + ] +} diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final-confirmation.log b/docs/ui-consistency/evidence/sb10-12/browser-final-confirmation.log new file mode 100644 index 00000000..3bd7d486 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-final-confirmation.log @@ -0,0 +1,34 @@ +Traceback (most recent call last): + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 54, in + main() + ~~~~^^ + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 48, in main + page=touch.new_page();page.goto('http://127.0.0.1:5201/topology-canary?role=Deployer');page.locator('.tv-root').wait_for();page.wait_for_function("matchMedia('(pointer:coarse)').matches") + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/sync_api/_generated.py", line 11599, in wait_for_function + self._sync( + ~~~~~~~~~~^ + self._impl_obj.wait_for_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<4 lines>... + ) + ^ + ) + ^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_sync_base.py", line 115, in _sync + return task.result() + ~~~~~~~~~~~^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_page.py", line 1110, in wait_for_function + return await self._main_frame.wait_for_function(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_frame.py", line 878, in wait_for_function + await self._channel.send("waitForFunction", self._timeout, params) + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_connection.py", line 69, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<3 lines>... + ) + ^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_connection.py", line 559, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_function: Timeout 30000ms exceeded. diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom1.png new file mode 100644 index 00000000..b3e38e3b Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom2.png new file mode 100644 index 00000000..2d183920 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-390-844-zoom1.png new file mode 100644 index 00000000..0ed93814 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-768-480-zoom1.png new file mode 100644 index 00000000..a654b3b6 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-dark-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom1.png new file mode 100644 index 00000000..4b2314ff Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom2.png new file mode 100644 index 00000000..ebe586a2 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-390-844-zoom1.png new file mode 100644 index 00000000..fe74ef3e Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-768-480-zoom1.png new file mode 100644 index 00000000..4ff33b58 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/health-light-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/progress.json b/docs/ui-consistency/evidence/sb10-12/browser-final/progress.json new file mode 100644 index 00000000..04b8e1bc --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-final/progress.json @@ -0,0 +1,574 @@ +[ + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3227.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": false + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5140.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3246.5390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": false + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "dark", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "dark", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3222.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": false + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "dark", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5140.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "dark", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3247.5390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": false + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "dark", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "dark", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "dark", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "dark", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "kind": "policy", + "role": "Viewer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Designer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Deployer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Administrator,Designer,Deployer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "passed": true + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom1.png new file mode 100644 index 00000000..4f296d8c Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom2.png new file mode 100644 index 00000000..70edaf3b Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-390-844-zoom1.png new file mode 100644 index 00000000..a4e8b215 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-768-480-zoom1.png new file mode 100644 index 00000000..d6c06a61 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-dark-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom1.png new file mode 100644 index 00000000..668a31d5 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom2.png new file mode 100644 index 00000000..d76cc9fc Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-390-844-zoom1.png new file mode 100644 index 00000000..cca2758a Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-768-480-zoom1.png new file mode 100644 index 00000000..9e382774 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-light-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-390-844.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-390-844.png new file mode 100644 index 00000000..f38906d0 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-390-844.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-768-480.png b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-768-480.png new file mode 100644 index 00000000..9fe5bb89 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-768-480.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-first-summary.log b/docs/ui-consistency/evidence/sb10-12/browser-first-summary.log new file mode 100644 index 00000000..4471ec0c --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-first-summary.log @@ -0,0 +1,17 @@ +Traceback (most recent call last): + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 47, in + asyncio.run(main()) + ~~~~~~~~~~~^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.14/3.14.3_1/Frameworks/Python.framework/Versions/3.14/lib/python3.14/asyncio/runners.py", line 204, in run + return runner.run(main) + ~~~~~~~~~~^^^^^^ + File "/opt/homebrew/Cellar/python@3.14/3.14.3_1/Frameworks/Python.framework/Versions/3.14/lib/python3.14/asyncio/runners.py", line 127, in run + return self._loop.run_until_complete(task) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^ + File "/opt/homebrew/Cellar/python@3.14/3.14.3_1/Frameworks/Python.framework/Versions/3.14/lib/python3.14/asyncio/base_events.py", line 719, in run_until_complete + return future.result() + ~~~~~~~~~~~~~^^ + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 11, in main + context,worker=await zoom_browser(p) + ^^^^^^^^^^^^^^^^^^^^^ +TypeError: '_GeneratorContextManager' object can't be awaited diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial-matrix.log b/docs/ui-consistency/evidence/sb10-12/browser-initial-matrix.log new file mode 100644 index 00000000..fa58e8da --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-initial-matrix.log @@ -0,0 +1,40 @@ +Traceback (most recent call last): + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 46, in + main() + ~~~~^^ + File "/Users/dohertj2/Desktop/ScadaBridge/infra/tools/inspect_operations.py", line 19, in main + page.goto('http://127.0.0.1:5201/'+route) + ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/sync_api/_generated.py", line 9054, in goto + self._sync( + ~~~~~~~~~~^ + self._impl_obj.goto( + ^^^^^^^^^^^^^^^^^^^^ + url=url, timeout=timeout, waitUntil=wait_until, referer=referer + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + ) + ^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_sync_base.py", line 115, in _sync + return task.result() + ~~~~~~~~~~~^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_page.py", line 552, in goto + return await self._main_frame.goto(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_frame.py", line 153, in goto + await self._channel.send( + "goto", self._navigation_timeout, locals_to_params(locals()) + ) + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_connection.py", line 69, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<3 lines>... + ) + ^ + File "/opt/homebrew/lib/python3.14/site-packages/playwright/_impl/_connection.py", line 559, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.Error: Page.goto: net::ERR_HTTP_RESPONSE_CODE_FAILURE at http://127.0.0.1:5201/operations-canary?role=Viewer +Call log: + - navigating to "http://127.0.0.1:5201/operations-canary?role=Viewer", waiting until "load" + diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom1.png new file mode 100644 index 00000000..4814261e Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom2.png new file mode 100644 index 00000000..ebe586a2 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-390-844-zoom1.png new file mode 100644 index 00000000..0a3e7ae6 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-768-480-zoom1.png new file mode 100644 index 00000000..4ff33b58 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-dark-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom1.png new file mode 100644 index 00000000..c8234ff2 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom2.png new file mode 100644 index 00000000..ebe586a2 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-390-844-zoom1.png new file mode 100644 index 00000000..0a3e7ae6 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-768-480-zoom1.png new file mode 100644 index 00000000..4ff33b58 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/health-light-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/progress.json b/docs/ui-consistency/evidence/sb10-12/browser-initial/progress.json new file mode 100644 index 00000000..93e8b77d --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-initial/progress.json @@ -0,0 +1,574 @@ +[ + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3148.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5075.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3228.5390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3150.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5075.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3207.0390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "kind": "policy", + "role": "Viewer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Designer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Deployer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Administrator,Designer,Deployer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "passed": true + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/results.json b/docs/ui-consistency/evidence/sb10-12/browser-initial/results.json new file mode 100644 index 00000000..11ce2153 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/browser-initial/results.json @@ -0,0 +1,686 @@ +[ + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3148.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5075.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3228.5390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 631, + "scroll": 2921, + "overflow": "auto" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 859.5, + "viewport": 900 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2921, + "scroll": 2921, + "overflow": "visible" + }, + "rows": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3150.578125, + "viewport": 480 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 390, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 4736, + "scroll": 4736, + "overflow": "visible" + }, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "endFocus": { + "role": "treeitem", + "bottom": 5075.625, + "viewport": 844 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": true + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Topology" + ], + "sites": [], + "summary": null, + "tree": { + "height": 2919, + "scroll": 2919, + "overflow": "visible" + }, + "rows": [ + 29.59375, + 29.59375, + 29.59375, + 29.59375, + 29.59375 + ], + "endFocus": { + "role": "treeitem", + "bottom": 3207.0390625, + "viewport": 450 + }, + "lazyLoad": true, + "loadedSearchQualifier": "Search loaded sites, areas, instances...", + "kind": "topology", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 1440, + "dpr": 1, + "document": 1440, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "width": 768, + "dpr": 1, + "document": 768, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 768, + 480 + ], + "errors": [], + "passed": true + }, + { + "width": 390, + "dpr": 1, + "document": 452, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 1, + "requested": [ + 390, + 844 + ], + "errors": [], + "passed": false + }, + { + "width": 720, + "dpr": 2, + "document": 720, + "scheme": "light", + "headings": [ + "Health Dashboard" + ], + "sites": [ + "offline", + "warning", + "unknown", + "healthy" + ], + "summary": "SITES ONLINE\n3\nSITES OFFLINE\n1\nSITES WITH ERRORS IN LAST REPORT INTERVAL\n0\nSITES WITH UNKNOWN METRICS\n1", + "tree": null, + "rows": [], + "orderPass": true, + "kind": "health", + "zoom": 2, + "requested": [ + 1440, + 900 + ], + "errors": [], + "passed": true + }, + { + "kind": "policy", + "role": "Viewer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 1 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Designer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Deployer", + "shortcuts": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "rail": { + "/design/templates": 0, + "/audit/configuration": 0 + }, + "passed": true + }, + { + "kind": "policy", + "role": "Administrator,Designer,Deployer", + "shortcuts": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "rail": { + "/design/templates": 1, + "/audit/configuration": 1 + }, + "passed": true + }, + { + "width": 390, + "document": 390, + "coarse": false, + "rows": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875 + ], + "toggles": [ + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + }, + { + "width": 20, + "height": 21.609375 + } + ], + "overflow": "visible", + "kind": "touch", + "requested": [ + 390, + 844 + ], + "passed": false + }, + { + "width": 768, + "document": 768, + "coarse": true, + "rows": [ + 52, + 52, + 52, + 52, + 52, + 52, + 52, + 52 + ], + "toggles": [ + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + } + ], + "overflow": "visible", + "kind": "touch", + "requested": [ + 768, + 480 + ], + "passed": true + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom1.png new file mode 100644 index 00000000..f8707e80 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom2.png new file mode 100644 index 00000000..70bb6955 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-390-844-zoom1.png new file mode 100644 index 00000000..ac6f32b0 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-768-480-zoom1.png new file mode 100644 index 00000000..9e382774 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-dark-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom1.png new file mode 100644 index 00000000..dc6e2cb0 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom2.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom2.png new file mode 100644 index 00000000..0a3da4da Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-1440-900-zoom2.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-390-844-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-390-844-zoom1.png new file mode 100644 index 00000000..a3050d03 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-390-844-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-768-480-zoom1.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-768-480-zoom1.png new file mode 100644 index 00000000..d518a666 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-light-768-480-zoom1.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-390-844.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-390-844.png new file mode 100644 index 00000000..82411cc2 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-390-844.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-768-480.png b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-768-480.png new file mode 100644 index 00000000..2030fcc8 Binary files /dev/null and b/docs/ui-consistency/evidence/sb10-12/browser-initial/topology-touch-768-480.png differ diff --git a/docs/ui-consistency/evidence/sb10-12/final-wrap-focused.log b/docs/ui-consistency/evidence/sb10-12/final-wrap-focused.log new file mode 100644 index 00000000..1323b4dd --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/final-wrap-focused.log @@ -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.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.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.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 + 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: 101, Skipped: 0, Total: 101, Duration: 544 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch-confirmation.json b/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch-confirmation.json new file mode 100644 index 00000000..f08a30ff --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch-confirmation.json @@ -0,0 +1,226 @@ +[ + { + "width": 768, + "document": 768, + "dpr": 1, + "scheme": "light", + "top": 443.109375, + "bottom": 478.578125, + "height": 480, + "focused": "treeitem", + "requested": [ + 768, + 480 + ], + "zoom": 1, + "kind": "keyboard", + "passed": true + }, + { + "width": 390, + "document": 390, + "dpr": 1, + "scheme": "light", + "top": 809.15625, + "bottom": 844.625, + "height": 844, + "focused": "treeitem", + "requested": [ + 390, + 844 + ], + "zoom": 1, + "kind": "keyboard", + "passed": true + }, + { + "width": 720, + "document": 720, + "dpr": 2, + "scheme": "light", + "top": 414.078125, + "bottom": 449.5390625, + "height": 450, + "focused": "treeitem", + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "kind": "keyboard", + "passed": true + }, + { + "width": 768, + "document": 768, + "dpr": 1, + "scheme": "dark", + "top": 442.109375, + "bottom": 477.578125, + "height": 480, + "focused": "treeitem", + "requested": [ + 768, + 480 + ], + "zoom": 1, + "kind": "keyboard", + "passed": true + }, + { + "width": 390, + "document": 390, + "dpr": 1, + "scheme": "dark", + "top": 809.15625, + "bottom": 844.625, + "height": 844, + "focused": "treeitem", + "requested": [ + 390, + 844 + ], + "zoom": 1, + "kind": "keyboard", + "passed": true + }, + { + "width": 720, + "document": 720, + "dpr": 2, + "scheme": "dark", + "top": 413.578125, + "bottom": 449.0390625, + "height": 450, + "focused": "treeitem", + "requested": [ + 1440, + 900 + ], + "zoom": 2, + "kind": "keyboard", + "passed": true + }, + { + "width": 390, + "document": 390, + "coarse": true, + "touch": 1, + "overflow": "visible", + "rows": [ + 52, + 52, + 52, + 52, + 52, + 52, + 52, + 52 + ], + "toggles": [ + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + } + ], + "requested": [ + 390, + 844 + ], + "initialRequestedContext": { + "coarse": true, + "touch": 1 + }, + "kind": "touch", + "passed": true + }, + { + "width": 768, + "document": 768, + "coarse": true, + "touch": 1, + "overflow": "visible", + "rows": [ + 52, + 52, + 52, + 52, + 52, + 52, + 52, + 52 + ], + "toggles": [ + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + }, + { + "width": 44, + "height": 44 + } + ], + "requested": [ + 768, + 480 + ], + "initialRequestedContext": { + "coarse": true, + "touch": 1 + }, + "kind": "touch", + "passed": true + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch.log b/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch.log new file mode 100644 index 00000000..68b76766 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch.log @@ -0,0 +1,4 @@ +{ + "cases": 8, + "passed": 8 +} diff --git a/docs/ui-consistency/evidence/sb10-12/full-suite.log b/docs/ui-consistency/evidence/sb10-12/full-suite.log new file mode 100644 index 00000000..536a9da6 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/full-suite.log @@ -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.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.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.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.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.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.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.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/sb10-12/sb10-12-final.trx + +Passed! - Failed: 0, Passed: 1591, Skipped: 0, Total: 1591, Duration: 35 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/green-batch-focused.log b/docs/ui-consistency/evidence/sb10-12/green-batch-focused.log new file mode 100644 index 00000000..9f56d5dd --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/green-batch-focused.log @@ -0,0 +1,25 @@ + ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll + ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll + ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll + ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll + ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll + ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll + ZB.MOM.WW.ScadaBridge.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.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.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.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll + ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll + ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll + ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll + ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll + ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll + ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll + ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll + ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll + ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll +Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0) +A total of 1 test files matched the specified pattern. + +Passed! - Failed: 0, Passed: 101, Skipped: 0, Total: 101, Duration: 504 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/green-exact-policies-health.log b/docs/ui-consistency/evidence/sb10-12/green-exact-policies-health.log new file mode 100644 index 00000000..70be239a --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/green-exact-policies-health.log @@ -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.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.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.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll + ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll + ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll + ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll + ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll + ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll + ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll +Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0) +A total of 1 test files matched the specified pattern. + +Passed! - Failed: 0, Passed: 59, Skipped: 0, Total: 59, Duration: 465 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/green-policy-health-corrected.log b/docs/ui-consistency/evidence/sb10-12/green-policy-health-corrected.log new file mode 100644 index 00000000..1bb7e0a7 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/green-policy-health-corrected.log @@ -0,0 +1,55 @@ + 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.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 + 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.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Viewer", templates: False, audit: True) [FAIL] +[xUnit.net 00:00:00.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Designer", templates: True, audit: False) [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Viewer", templates: False, audit: True) [2 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 1 +Actual: 0 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 57 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Designer", templates: True, audit: False) [1 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 1 +Actual: 0 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 56 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +[xUnit.net 00:00:00.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Administrator", templates: True, audit: True) [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Administrator", templates: True, audit: True) [1 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 1 +Actual: 0 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 56 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + +Failed! - Failed: 3, Passed: 55, Skipped: 0, Total: 58, Duration: 451 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/green-policy-health.log b/docs/ui-consistency/evidence/sb10-12/green-policy-health.log new file mode 100644 index 00000000..b98d69f7 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/green-policy-health.log @@ -0,0 +1,20 @@ + 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 +/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor(71,33): error CS0103: The name 'AuthorizationPolicies' does not exist in the current context [/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/ZB.MOM.WW.ScadaBridge.CentralUI.csproj] +/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor(84,33): error CS0103: The name 'AuthorizationPolicies' does not exist in the current context [/Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/ZB.MOM.WW.ScadaBridge.CentralUI.csproj] diff --git a/docs/ui-consistency/evidence/sb10-12/green-real-policy-fixture.log b/docs/ui-consistency/evidence/sb10-12/green-real-policy-fixture.log new file mode 100644 index 00000000..a18ffa69 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/green-real-policy-fixture.log @@ -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.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.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.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.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.41] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Administrator", templates: True, audit: True) [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Administrator", templates: True, audit: True) [1 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 1 +Actual: 0 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 64 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + +Failed! - Failed: 1, Passed: 57, Skipped: 0, Total: 58, Duration: 445 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/health-overflow-before.json b/docs/ui-consistency/evidence/sb10-12/health-overflow-before.json new file mode 100644 index 00000000..89d78ff5 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/health-overflow-before.json @@ -0,0 +1,23 @@ +[ + { + "tag": "DIV", + "cls": "btn-group btn-group-sm", + "text": "24h\n 7d\n 30d\n 90d", + "right": 452.15625, + "width": 163 + }, + { + "tag": "BUTTON", + "cls": "btn btn-outline-secondary", + "text": "30d", + "right": 409.75, + "width": 43.40625 + }, + { + "tag": "BUTTON", + "cls": "btn btn-outline-secondary", + "text": "90d", + "right": 452.15625, + "width": 43.40625 + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/keyboard-scroll-timing.json b/docs/ui-consistency/evidence/sb10-12/keyboard-scroll-timing.json new file mode 100644 index 00000000..488bc338 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/keyboard-scroll-timing.json @@ -0,0 +1,46 @@ +[ + { + "active": "Synthetic facility 01 with a deliberately long local display nameSynthetic area ", + "role": "treeitem", + "tab": 0, + "scroll": 0, + "bodyHeight": 5165, + "scrollElement": "HTML", + "top": 412.625, + "style": "smooth", + "bodyStyle": "visible" + }, + { + "active": "Load instances", + "role": "treeitem", + "tab": 0, + "scroll": 0, + "bodyHeight": 5165, + "scrollElement": "HTML", + "top": 5105.15625, + "style": "smooth", + "bodyStyle": "visible" + }, + { + "active": "Load instances", + "role": "treeitem", + "tab": 0, + "scroll": 0, + "bodyHeight": 5165, + "scrollElement": "HTML", + "top": 5105.15625, + "style": "smooth", + "bodyStyle": "visible" + }, + { + "active": "Load instances", + "role": "treeitem", + "tab": 0, + "scroll": 4321, + "bodyHeight": 5165, + "scrollElement": "HTML", + "top": 784.15625, + "style": "smooth", + "bodyStyle": "visible" + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/red-policy-health.log b/docs/ui-consistency/evidence/sb10-12/red-policy-health.log new file mode 100644 index 00000000..f8a944a2 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/red-policy-health.log @@ -0,0 +1,128 @@ + 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.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.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.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.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll + ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll + ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll + ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll + ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll + ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll + ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll + ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll + ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll +Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0) +A total of 1 test files matched the specified pattern. +[xUnit.net 00:00:00.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Unmapped", templates: False, audit: False) [FAIL] +[xUnit.net 00:00:00.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Viewer", templates: False, audit: True) [FAIL] +[xUnit.net 00:00:00.42] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Designer", templates: True, audit: False) [FAIL] +[xUnit.net 00:00:00.43] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Deployer", templates: False, audit: False) [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Unmapped", templates: False, audit: False) [5 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 0 +Actual: 1 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 56 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Viewer", templates: False, audit: True) [5 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 0 +Actual: 1 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 56 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Designer", templates: True, audit: False) [1 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 0 +Actual: 1 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 57 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(role: "Deployer", templates: False, audit: False) [1 ms] + Error Message: + Assert.Equal() Failure: Values differ +Expected: 0 +Actual: 1 + Stack Trace: + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.DashboardStateTests.Shortcuts_RespectDestinationPolicies(String role, Boolean templates, Boolean audit) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs:line 56 + at InvokeStub_DashboardStateTests.Shortcuts_RespectDestinationPolicies(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +[xUnit.net 00:00:01.55] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.MissingReport_IsUnknownAndIntervalErrorsAreNamedHonestly [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.MissingReport_IsUnknownAndIntervalErrorsAreNamedHonestly [1 s] + Error Message: + Bunit.Extensions.WaitForHelpers.WaitForFailedException : The assertion did not pass within the timeout period. + +If this test does not fail consistently, the reason may be that +the wait timeout is too short, and the runtime did not have enough +time to complete the necessary number of renders of the component under test. +This can happen on highly utilized or slower hardware, for example. + +To determine if this is the cause, compare the check and render count(s) below +and see if they match what is expected. If they do not, +consider increasing the timeout, either at the individual +method call level, e.g. WaitForElement("div", TimeSpan.FromSeconds(15)), +or via the static TestContext.DefaultWaitTimeout property. + +Check count: 1. +Component render count: 2. +Total render count across all components: 0. +---- Bunit.ElementNotFoundException : No elements were found that matches the selector '[data-site-id='heartbeat-only']' + Stack Trace: + at Bunit.RenderedComponentWaitForHelperExtensions.WaitForAssertion[TComponent](IRenderedComponent`1 renderedComponent, Action assertion, Nullable`1 timeout) in /_/src/bunit/Extensions/WaitForHelpers/RenderedComponentWaitForHelperExtensions.WaitForState.cs:line 77 + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.MissingReport_IsUnknownAndIntervalErrorsAreNamedHonestly() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs:line 785 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +----- Inner 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.Pages.HealthPageTests.<>c__DisplayClass34_0.b__0() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs:line 787 + at Bunit.Extensions.WaitForHelpers.WaitForAssertionHelper`1.<>c__DisplayClass6_0.<.ctor>b__0() in /_/src/bunit/Extensions/WaitForHelpers/WaitForAssertionHelper.cs:line 35 + at Bunit.Extensions.WaitForHelpers.WaitForHelper`2.OnAfterRender(Object sender, EventArgs args) in /_/src/bunit/Extensions/WaitForHelpers/WaitForHelper.cs:line 173 +[xUnit.net 00:00:02.60] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.SiteCards_PrioritizeOfflineThenWarningsAndMissingReports [FAIL] + Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.SiteCards_PrioritizeOfflineThenWarningsAndMissingReports [1 s] + Error Message: + Bunit.Extensions.WaitForHelpers.WaitForFailedException : The assertion did not pass within the timeout period. + +If this test does not fail consistently, the reason may be that +the wait timeout is too short, and the runtime did not have enough +time to complete the necessary number of renders of the component under test. +This can happen on highly utilized or slower hardware, for example. + +To determine if this is the cause, compare the check and render count(s) below +and see if they match what is expected. If they do not, +consider increasing the timeout, either at the individual +method call level, e.g. WaitForElement("div", TimeSpan.FromSeconds(15)), +or via the static TestContext.DefaultWaitTimeout property. + +Check count: 1. +Component render count: 2. +Total render count across all components: 0. +---- Assert.Equal() Failure: Collections differ + ↓ (pos 0) +Expected: ["offline-a", "offline-z", "warning-b", "unknown", "healthy-a"] +Actual: [] + Stack Trace: + at Bunit.RenderedComponentWaitForHelperExtensions.WaitForAssertion[TComponent](IRenderedComponent`1 renderedComponent, Action assertion, Nullable`1 timeout) in /_/src/bunit/Extensions/WaitForHelpers/RenderedComponentWaitForHelperExtensions.WaitForState.cs:line 77 + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.SiteCards_PrioritizeOfflineThenWarningsAndMissingReports() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs:line 772 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +----- Inner Stack Trace ----- + at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Pages.HealthPageTests.<>c__DisplayClass33_0.b__1() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs:line 772 + at Bunit.Extensions.WaitForHelpers.WaitForAssertionHelper`1.<>c__DisplayClass6_0.<.ctor>b__0() in /_/src/bunit/Extensions/WaitForHelpers/WaitForAssertionHelper.cs:line 35 + at Bunit.Extensions.WaitForHelpers.WaitForHelper`2.OnAfterRender(Object sender, EventArgs args) in /_/src/bunit/Extensions/WaitForHelpers/WaitForHelper.cs:line 173 + +Failed! - Failed: 6, Passed: 41, Skipped: 0, Total: 47, Duration: 2 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0) diff --git a/docs/ui-consistency/evidence/sb10-12/sb10-12-final.trx b/docs/ui-consistency/evidence/sb10-12/sb10-12-final.trx new file mode 100644 index 00000000..a3aa17fc --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/sb10-12-final.trx @@ -0,0 +1,9711 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.4+50e68bbb8b (64-bit .NET 10.0.14) +[xUnit.net 00:00:00.07] Discovering: ZB.MOM.WW.ScadaBridge.CentralUI.Tests +[xUnit.net 00:00:00.15] Discovered: ZB.MOM.WW.ScadaBridge.CentralUI.Tests +[xUnit.net 00:00:00.22] Starting: ZB.MOM.WW.ScadaBridge.CentralUI.Tests +[INFO][11/14/2026 00:14:44.564Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.575Z][Thread 0015][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.600Z][Thread 0024][CoordinatedShutdown (akka://parked-mutation-cbf88993740b4b7283b7baba3318b4a2)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.666Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.682Z][Thread 0041][CoordinatedShutdown (akka://parked-mutation-f9ec7848320642b6bbf3dd3d58c5fc68)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.710Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-notif-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.725Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.735Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.747Z][Thread 0020][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.799Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.957Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.969Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:44.993Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.020Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.031Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.053Z][Thread 0047][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.097Z][Thread 0052][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.108Z][Thread 0052][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.130Z][Thread 0052][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.142Z][Thread 0052][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.205Z][Thread 0052][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.333Z][Thread 0044][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.377Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.413Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.435Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.444Z][Thread 0045][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.463Z][Thread 0049][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.490Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.499Z][Thread 0049][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.508Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.569Z][Thread 0056][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.570Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.588Z][Thread 0056][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.592Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.602Z][Thread 0056][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.666Z][Thread 0056][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.666Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.677Z][Thread 0051][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.678Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.726Z][Thread 0051][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.733Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.744Z][Thread 0043][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.745Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.825Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.826Z][Thread 0035][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.834Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.837Z][Thread 0035][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.843Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.847Z][Thread 0035][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.858Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.868Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.870Z][Thread 0047][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.875Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.885Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.907Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.908Z][Thread 0047][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.908Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.927Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.936Z][Thread 0057][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.936Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.945Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.955Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:45.954Z][Thread 0057][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.099Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.101Z][Thread 0040][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.131Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.136Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.150Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.148Z][Thread 0040][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.158Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.168Z][Thread 0040][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.215Z][Thread 0038][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.216Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.217Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.217Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.224Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.269Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.551Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.553Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.561Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.561Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.569Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.571Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.571Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.587Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.593Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.594Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.594Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.609Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.609Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.610Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.618Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.626Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.629Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.637Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.645Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.661Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.738Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.738Z][Thread 0021][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.746Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.747Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.747Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.747Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.761Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.761Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.761Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.771Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.771Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.779Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.787Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.788Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.794Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.803Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.807Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.813Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.820Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.820Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.822Z][Thread 0017][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.831Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.839Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.840Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.851Z][Thread 0005][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.855Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.860Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.866Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.868Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.875Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.876Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.893Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.893Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.901Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.901Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.910Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.917Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.920Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.934Z][Thread 0027][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[INFO][11/14/2026 00:14:46.975Z][Thread 0018][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0]. +[xUnit.net 00:00:35.45] Finished: ZB.MOM.WW.ScadaBridge.CentralUI.Tests + + + + \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/source-freeze.json b/docs/ui-consistency/evidence/sb10-12/source-freeze.json new file mode 100644 index 00000000..4c8fb6b0 --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/source-freeze.json @@ -0,0 +1,30 @@ +[ + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor", + "sha256": "b3bb2c73802cfe88230e3d58dc8cd9a4d700c19be37cedef3932a12cfaf8d28d" + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor", + "sha256": "c30cd66b8fe1244442b5b98a91e4c067ccb263eff1beaac4e2b5d364236c0f71" + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor", + "sha256": "c67b39abc0ea879387d2354c595bfbd6aa2ec60ba459ee5cd8b1c8136146c85d" + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor.css", + "sha256": "f1bcb918867f06b954eb4c89fca77ff0209ad5bfd09480cccc8cf5b279f39f20" + }, + { + "path": "src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css", + "sha256": "535bd58d69a7060e48c3e20259788e46b0fc4911619a269c13f4e1ce27a0a1e3" + }, + { + "path": "tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs", + "sha256": "18252c79c81485e0c9b7d28b87df14053a45cba5a68cabc02965acb6c30769ea" + }, + { + "path": "tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs", + "sha256": "172cea51beb00f096c585ca3989f70c0bf8a6f838392c01f5a712f2f2957120c" + } +] \ No newline at end of file diff --git a/docs/ui-consistency/evidence/sb10-12/topology-before.json b/docs/ui-consistency/evidence/sb10-12/topology-before.json new file mode 100644 index 00000000..a68c649c --- /dev/null +++ b/docs/ui-consistency/evidence/sb10-12/topology-before.json @@ -0,0 +1,58 @@ +[ + { + "width": 390, + "height": 844, + "document": 390, + "title": "Topology", + "tree": { + "x": 32, + "y": 408.625, + "width": 326, + "height": 604, + "top": 408.625, + "right": 358, + "bottom": 1012.625, + "left": 32 + }, + "rowHeights": [ + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 51.21875, + 35.46875 + ], + "body": "\nSynthetic area 02 with a long inspection label\nSynthetic area 03 with a long inspection label\nSynthetic area 04 with a long inspection label\nSynthetic area 05 with a long inspection label\nSynthetic area 06 with a long inspection label\nLoad instances", + "errors": [] + }, + { + "width": 768, + "height": 480, + "document": 768, + "title": "Topology", + "tree": { + "x": 32, + "y": 313.765625, + "width": 704, + "height": 240, + "top": 313.765625, + "right": 736, + "bottom": 553.765625, + "left": 32 + }, + "rowHeights": [ + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 29.609375, + 35.46875 + ], + "body": "\nSynthetic area 02 with a long inspection label\nSynthetic area 03 with a long inspection label\nSynthetic area 04 with a long inspection label\nSynthetic area 05 with a long inspection label\nSynthetic area 06 with a long inspection label\nLoad instances", + "errors": [] + } +] \ No newline at end of file diff --git a/infra/tools/confirm_topology_focus.py b/infra/tools/confirm_topology_focus.py new file mode 100644 index 00000000..f59f768a --- /dev/null +++ b/infra/tools/confirm_topology_focus.py @@ -0,0 +1,27 @@ +"""Focused technical confirmation: await native smooth scrolling and verify real touch emulation.""" +import json,sys +from pathlib import Path +from playwright.sync_api import sync_playwright +sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary') +from browser_zoom import zoom_browser,set_browser_zoom +out=[] +with sync_playwright() as p: + with zoom_browser(p) as (context,worker): + for scheme in ['light','dark']: + for w,h,z in [(768,480,1),(390,844,1),(1440,900,2)]: + page=context.new_page();page.set_viewport_size({'width':w,'height':h});page.goto('http://127.0.0.1:5201/topology-canary?role=Deployer',wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme);set_browser_zoom(worker,page,z) + page.locator('[role=treeitem][tabindex="0"]').first.focus();page.keyboard.press('End') + page.wait_for_function("document.activeElement === [...document.querySelectorAll('[role=treeitem]')].at(-1)") + page.wait_for_function("document.activeElement.querySelector('.tv-row').getBoundingClientRect().bottom <= innerHeight + 1") + record=page.evaluate("""() => ({width:innerWidth,document:document.documentElement.scrollWidth,dpr:devicePixelRatio,scheme:document.documentElement.dataset.bsTheme,top:document.activeElement.querySelector('.tv-row').getBoundingClientRect().top,bottom:document.activeElement.querySelector('.tv-row').getBoundingClientRect().bottom,height:innerHeight,focused:document.activeElement.getAttribute('role')})""") + record.update(requested=[w,h],zoom=z,kind='keyboard');record['passed']=record['top']>=0 and record['bottom']<=record['height']+1 and record['document']<=record['width'];out.append(record);page.close() + b=p.chromium.launch(channel='chromium') + for w,h in [(390,844),(768,480)]: + context=b.new_context(viewport={'width':w,'height':h},is_mobile=True,has_touch=True);page=context.new_page();page.goto('http://127.0.0.1:5201/topology-canary?role=Deployer',wait_until='networkidle') + requested=page.evaluate('({coarse:matchMedia("(pointer:coarse)").matches,touch:navigator.maxTouchPoints})') + cdp=context.new_cdp_session(page);cdp.send('Emulation.setTouchEmulationEnabled',{'enabled':True,'maxTouchPoints':1});page.wait_for_function('matchMedia("(pointer:coarse)").matches') + record=page.evaluate("""() => ({width:innerWidth,document:document.documentElement.scrollWidth,coarse:matchMedia('(pointer:coarse)').matches,touch:navigator.maxTouchPoints,overflow:getComputedStyle(document.querySelector('.topology-tree')).overflowY,rows:[...document.querySelectorAll('.tv-row')].slice(0,8).map(e=>e.getBoundingClientRect().height),toggles:[...document.querySelectorAll('.tv-toggle')].slice(0,8).map(e=>({width:e.getBoundingClientRect().width,height:e.getBoundingClientRect().height}))})""") + record.update(requested=[w,h],initialRequestedContext=requested,kind='touch');record['passed']=record['coarse'] and record['touch']==1 and record['document']<=record['width'] and min(record['rows'])>=44 and all(x['width']>=44 and x['height']>=44 for x in record['toggles']) and record['overflow']=='visible';out.append(record) + page.screenshot(path=f'docs/ui-consistency/evidence/sb10-12/browser-final/topology-verified-touch-{w}-{h}.png');context.close() + b.close() +Path('docs/ui-consistency/evidence/sb10-12/focused-keyboard-touch-confirmation.json').write_text(json.dumps(out,indent=2));print(json.dumps({'cases':len(out),'passed':sum(r['passed'] for r in out)},indent=2)) diff --git a/infra/tools/inspect_operations.py b/infra/tools/inspect_operations.py new file mode 100644 index 00000000..558c68ee --- /dev/null +++ b/infra/tools/inspect_operations.py @@ -0,0 +1,54 @@ +"""Bounded synthetic actual-component SB10–12 check; no live/fleet operations.""" +import asyncio,json,sys +from pathlib import Path +from playwright.sync_api import sync_playwright +sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary') +from browser_zoom import zoom_browser,set_browser_zoom +OUT=Path('docs/ui-consistency/evidence/sb10-12/browser-final');OUT.mkdir(parents=True,exist_ok=True) +def main(): + results=[] + with sync_playwright() as p: + with zoom_browser(p) as (context,worker): + for kind in ['topology','health']: + for scheme in ['light','dark']: + for w,h,zoom in [(1440,900,1),(768,480,1),(390,844,1),(1440,900,2)]: + page=context.new_page();page.set_viewport_size({'width':w,'height':h}) + errors=[];page.on('pageerror',lambda e:errors.append(str(e))) + page.add_init_script("localStorage.setItem('sb-theme', '"+scheme+"')") + route='topology-canary?role=Deployer' if kind=='topology' else 'operations-canary?role=Viewer' + page.goto('http://127.0.0.1:5201/'+route,wait_until='networkidle');page.evaluate('s => window.sbTheme.set(s)',scheme) + page.locator('.tv-root' if kind=='topology' else '[data-site-id]').first.wait_for() + page.wait_for_timeout(500) + set_browser_zoom(worker,page,zoom) + data=page.evaluate('''() => ({width:innerWidth,dpr:devicePixelRatio,document:document.documentElement.scrollWidth,scheme:document.documentElement.dataset.bsTheme,headings:[...document.querySelectorAll('h1')].map(e=>e.textContent),sites:[...document.querySelectorAll('[data-site-id]')].map(e=>e.dataset.siteId),summary:document.querySelector('[aria-label="Site observations"]')?.innerText,tree:document.querySelector('.topology-tree')&&{height:document.querySelector('.topology-tree').clientHeight,scroll:document.querySelector('.topology-tree').scrollHeight,overflow:getComputedStyle(document.querySelector('.topology-tree')).overflowY},rows:[...document.querySelectorAll('.tv-row')].slice(0,5).map(e=>e.getBoundingClientRect().height)})''') + if kind=='topology': + item=page.locator('[role=treeitem][tabindex="0"]').first;item.focus();page.keyboard.press('End');page.wait_for_function("document.activeElement === [...document.querySelectorAll('[role=treeitem]')].at(-1)") + data['endFocus']=page.evaluate('''() => ({role:document.activeElement.getAttribute('role'),bottom:document.activeElement.querySelector('.tv-row')?.getBoundingClientRect().bottom,viewport:innerHeight})''') + page.keyboard.press('Home');page.wait_for_function("document.activeElement === document.querySelector('[role=treeitem]')") + page.get_by_role('button',name='Load instances',exact=True).first.click() + page.get_by_text('Page 1',exact=True).first.wait_for();data['lazyLoad']=True + page.get_by_role('textbox',name='Search loaded sites, areas and instances').fill('facility 01');data['loadedSearchQualifier']=page.get_by_role('textbox',name='Search loaded sites, areas and instances').get_attribute('placeholder') + else: data['orderPass']=data['sites']==['offline','warning','unknown','healthy'] + data.update(kind=kind,zoom=zoom,requested=[w,h],errors=errors) + data['passed']=data['document']<=data['width'] and data['scheme']==scheme and not errors and len(data['headings'])==1 and (data.get('orderPass',True)) and (kind!='topology' or data['endFocus']['bottom']<=data['endFocus']['viewport']) + if zoom==2: page.screenshot(path=str(OUT/f'{kind}-{scheme}-{w}-{h}-zoom{zoom}.png'),full_page=False) + else: page.screenshot(path=str(OUT/f'{kind}-{scheme}-{w}-{h}-zoom{zoom}.png'),full_page=False) + results.append(data);(OUT/'progress.json').write_text(json.dumps(results,indent=2));page.close() + for role,templates,audit in [('Viewer',False,True),('Designer',True,False),('Deployer',False,False),('Administrator,Designer,Deployer',True,True)]: + page=context.new_page();page.goto('http://127.0.0.1:5201/batch-two?Sample=dashboard&role='+role) + page.get_by_role('region',name='Sites configured',exact=True).wait_for();page.wait_for_timeout(300) + data={target:page.locator('main a[href="'+target+'"]').count() for target in ['/design/templates','/audit/configuration']} + # Rail uses the same real policies; hidden native navigation remains in DOM for comparison. + nav={target:page.locator('nav a[href="'+target+'"]').count() for target in data} + results.append(dict(kind='policy',role=role,shortcuts=data,rail=nav,passed=data['/design/templates']==int(templates) and data['/audit/configuration']==int(audit) and data==nav));(OUT/'progress.json').write_text(json.dumps(results,indent=2)) + page.close() + touch_browser=p.chromium.launch(channel='chromium',args=['--touch-events=enabled']) + for w,h in [(390,844),(768,480)]: + touch=touch_browser.new_context(viewport={'width':w,'height':h},is_mobile=True,has_touch=True) + page=touch.new_page();page.goto('http://127.0.0.1:5201/topology-canary?role=Deployer');page.locator('.tv-root').wait_for();page.wait_for_function("matchMedia('(pointer:coarse)').matches") + record=page.evaluate("""() => ({width:innerWidth,document:document.documentElement.scrollWidth,coarse:matchMedia('(pointer:coarse)').matches,rows:[...document.querySelectorAll('.tv-row')].slice(0,8).map(e=>e.getBoundingClientRect().height),toggles:[...document.querySelectorAll('.tv-toggle')].slice(0,8).map(e=>({width:e.getBoundingClientRect().width,height:e.getBoundingClientRect().height})),overflow:getComputedStyle(document.querySelector('.topology-tree')).overflowY})""") + record.update(kind='touch',requested=[w,h]);record['passed']=record['coarse'] and min(record['rows'])>=44 and all(t['width']>=44 and t['height']>=44 for t in record['toggles']) and record['document']<=record['width'] and record['overflow']=='visible' + results.append(record);page.screenshot(path=str(OUT/f'topology-touch-{w}-{h}.png'));touch.close() + touch_browser.close() + (OUT/'results.json').write_text(json.dumps(results,indent=2));print(json.dumps({'cases':len(results),'passed':sum(x['passed'] for x in results),'failures':[r for r in results if not r['passed']]},indent=2)) +main() diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor index fa40a5f4..b7a65144 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor @@ -1,5 +1,6 @@ @page "/" @attribute [Authorize] +@using ZB.MOM.WW.ScadaBridge.Security @using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories @using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Security @inject ISiteRepository SiteRepository @@ -19,55 +20,38 @@ - @* KPI row *@ -
-
-
-
-
@CountText(_sites)
- @if (_sites.Failed) - { - - } -
Sites configured
-
-
+
+
+
Sites configured
+
@CountText(_sites)
+ @if (_sites.Failed) + { + + }
-
-
-
-
@CountText(_connections)
- @if (_connections.Failed) - { - - } -
Data connections configured
-
-
+
+
Data connections configured
+
@CountText(_connections)
+ @if (_connections.Failed) + { + + }
-
-
-
-
@CountText(_templates)
- @if (_templates.Failed) - { - - } -
Templates
-
-
+
+
Templates
+
@CountText(_templates)
+ @if (_templates.Failed) + { + + }
-
-
-
-
@CountText(_apiKeys)
- @if (_apiKeys.Failed) - { - - } -
API keys
-
-
+
+
API keys
+
@CountText(_apiKeys)
+ @if (_apiKeys.Failed) + { + + }
@@ -85,6 +69,7 @@
+ + + +
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor index 8de2f74a..5e88660b 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor @@ -29,7 +29,7 @@ @inject IServiceScopeFactory ScopeFactory @implements IDisposable -
+
-
+
+ @if (_siteStates.Count > 0) + { +
+
Sites online
@_siteStates.Values.Count(s => s.IsOnline)
+
Sites offline
@_siteStates.Values.Count(s => !s.IsOnline)
+
Sites with errors in last report interval
@_siteStates.Values.Count(SiteHasReportIntervalErrors)
+
Sites with unknown metrics
@_siteStates.Values.Count(s => s.LatestReport is null)
+
+ } + @* Headline KPI groups. Each is a self-contained panel, so each gets its own card boundary — the same treatment the Site Health Trends group below already uses, including tiles-that-are-cards nested in a card body (Trends does exactly that @@ -112,8 +122,8 @@ reuses the site keys already loaded into _siteStates; the window toggle drives the time range. Both re-query independently. *@
-
-
+
+
Site Health Trends
@if (_trendSiteKeys.Count > 0) { @@ -198,50 +208,13 @@ } else { - @* Overview cards — the fourth headline tile row, so it takes the same card - boundary as the three above it. It was also the only tile row on the page - with no heading at all; it now carries one for the same reason. *@ -
-
-
-
Sites
-
-
-
-
-
-

@_siteStates.Values.Count(s => s.IsOnline)

- Sites Online -
-
-
-
-
-
-

@_siteStates.Values.Count(s => !s.IsOnline)

- Sites Offline -
-
-
-
-
-
-

@_siteStates.Values.Count(SiteHasActiveErrors)

- Sites with active errors -
-
-
-
-
-
- - @* Per-site detail cards — central cluster pinned to the top, then sites alphabetically *@ - @foreach (var (siteId, state) in _siteStates.OrderBy(s => s.Key == CentralHealthReportLoop.CentralSiteId ? 0 : 1).ThenBy(s => s.Key)) + @* Actionable observations first; display name and site id provide stable tie-breakers. *@ + @foreach (var (siteId, state) in _siteStates.OrderBy(s => SiteAttentionOrder(s.Value)).ThenBy(s => GetSiteName(s.Key), StringComparer.OrdinalIgnoreCase).ThenBy(s => s.Key, StringComparer.Ordinal)) { var isCentral = siteId == CentralHealthReportLoop.CentralSiteId; var siteName = isCentral ? "Central Cluster" : GetSiteName(siteId); var detailsCollapseId = $"site-details-{siteId}"; -
+
@* Display name and machine id are two different things and are read for two different reasons, so they get two lines: chips + name on @@ -258,6 +231,10 @@ @OfflineGlyph Offline } @siteName + @if (state.LatestReport is null) + { + Metrics unknown + } @if (state.IsOnline && state.IsMetricsStale) { 0; } + // Liveness remains the aggregator's observation. Missing metrics are not a healthy reading; + // report counters describe one collection interval, not an ongoing or cumulative fault. + private int SiteAttentionOrder(SiteHealthState state) => !state.IsOnline ? 0 + : state.IsMetricsStale || IsLocalDbBacklogSustained(state) || IsStartupReconcilerMissing(state) + || HasSecretMirrorFailures(state) || HasAuditRejectedRows(state) || SiteHasReportIntervalErrors(state) ? 1 + : state.LatestReport is null ? 2 : 3; + protected override async Task OnInitializedAsync() { // Load site names for display diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor.css b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor.css index 07686ec1..22bd7b23 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor.css +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/TreeView.razor.css @@ -160,3 +160,13 @@ li[role="treeitem"]:focus-visible > .tv-row { .tv-row .tv-kebab .show { opacity: 1; } + +/* Touch retains the same tree callbacks/roving focus with practical hit regions. + Fine pointers retain the existing compact rows. */ +@media (pointer: coarse) { + .tv-row { min-height: 44px; } + .tv-row .tv-toggle { min-width: 44px; min-height: 44px; } + .tv-row .tv-content { min-height: 44px; } + .tv-row .tv-content button { min-width: 44px; min-height: 44px; } + .tv-row .tv-kebab { opacity: 1; } +} diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css b/src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css index a07f863b..5eb46b00 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css @@ -214,3 +214,30 @@ .text-primary { color: var(--accent-deep) !important; } .text-secondary { color: var(--ink-soft) !important; } .text-muted, .text-body-secondary, .text-body-tertiary { color: var(--ink-faint) !important; } + +/* Host-specific four-fact composition; shared aggregate tokens and geometry own each fact. */ +.dashboard-facts, .health-facts { grid-template-columns: repeat(4, minmax(0, 1fr)); } +@media (max-width: 1000px) { .dashboard-facts, .health-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +@media (max-width: 420px) { .dashboard-facts, .health-facts { grid-template-columns: minmax(0, 1fr); } } + +/* Topology follows document flow on small/short screens; no guessed header subtraction. + On roomy desktop screens the page/toolbar/tree share the actual available height. */ +.topology-page { display: flex; flex-direction: column; min-width: 0; } +.topology-tree { min-width: 0; padding: 4px; } +@media (min-width: 992px) and (min-height: 640px) { + .app-shell > main.page:has(.topology-page) { + display: flex; + flex-direction: column; + height: 100vh; + height: 100dvh; + min-height: 0; + } + .topology-page { flex: 1; min-height: 0; padding-bottom: 1rem; } + .topology-tree { flex: 1; min-height: 12rem; overflow-y: auto; } +} +@media (pointer: coarse) { + .topology-page button, .topology-page summary, .topology-page input[type="text"] { + min-height: 44px; + } + .topology-page input[type="checkbox"] { min-width: 24px; min-height: 24px; } +} diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs index ea373ed0..8c4b4a72 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/DashboardStateTests.cs @@ -1,4 +1,9 @@ using Bunit; +using Microsoft.AspNetCore.Components; +using System.Security.Claims; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Authorization; +using ZB.MOM.WW.ScadaBridge.Security; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites; @@ -18,7 +23,7 @@ public class DashboardStateTests : BunitContext /// Registers deterministic read-only dependencies and a signed-in fixture. public DashboardStateTests() { - this.AddAuthorization().SetAuthorized("fixture"); + SetRoles("Viewer"); _sites.GetAllSitesAsync().Returns(Task.FromResult>([new("A", "a"), new("B", "b")])); _sites.GetAllDataConnectionsAsync().Returns(Task.FromResult>([new("Link", "OpcUa", 1)])); _templates.GetTemplateStubsAsync().Returns(Task.FromResult>([ @@ -26,6 +31,41 @@ public class DashboardStateTests : BunitContext _keys.ListAsync().Returns(Task.FromResult>([])); Services.AddSingleton(_sites); Services.AddSingleton(_templates); Services.AddSingleton(_keys); } + private void SetRoles(params string[] roles) + { + var claims = new List { new(JwtTokenService.UsernameClaimType, "fixture") }; + claims.AddRange(roles.Select(role => new Claim(JwtTokenService.RoleClaimType, role))); + Services.AddSingleton(new TestAuthStateProvider( + new ClaimsPrincipal(new ClaimsIdentity(claims, "TestAuth")))); + Services.AddAuthorizationCore(); + AuthorizationPolicies.AddScadaBridgeAuthorization(Services); + Services.AddSingleton(); + } + + private IRenderedComponent RenderDashboard() => Render(parameters => + parameters.Add(p => p.ChildContent, (RenderFragment)(builder => + { + builder.OpenComponent(0); + builder.CloseComponent(); + }))).FindComponent(); + + /// Shortcut visibility evaluates the same real policies as navigation and destination routes. + [Theory] + [InlineData("Viewer", false, true)] + [InlineData("Designer", true, false)] + [InlineData("Deployer", false, false)] + [InlineData("Administrator", false, true)] + [InlineData("Administrator,Designer,Deployer", true, true)] + [InlineData("Unmapped", false, false)] + public void Shortcuts_RespectDestinationPolicies(string role, bool templates, bool audit) + { + SetRoles(role.Split(',')); + var cut = RenderDashboard(); + Assert.Single(cut.FindAll("a[href='/monitoring/health']")); + Assert.Equal(templates ? 1 : 0, cut.FindAll("a[href='/design/templates']").Count); + Assert.Equal(audit ? 1 : 0, cut.FindAll("a[href='/audit/configuration']").Count); + } + /// Each read failure leaves the other facts intact and is never a false zero. [Theory] [InlineData("Sites configured")] @@ -38,7 +78,7 @@ public class DashboardStateTests : BunitContext if(label=="Data connections configured")_sites.GetAllDataConnectionsAsync().Returns(Task.FromException>(new Exception("local failure"))); if(label=="Templates")_templates.GetTemplateStubsAsync().Returns(Task.FromException>(new Exception("local failure"))); if(label=="API keys")_keys.ListAsync().Returns(Task.FromException>(new Exception("local failure"))); - var cut=Render(); + var cut=RenderDashboard(); var facts=new Dictionary{{"Sites configured","2"},{"Data connections configured","1"},{"Templates","3"},{"API keys","0"}}; foreach(var (name,count) in facts) { @@ -56,7 +96,7 @@ public class DashboardStateTests : BunitContext public void RetryFailure_PreservesSuccessfulFactsAndCanRecoverToZero() { _keys.ListAsync().Returns(Task.FromException>(new Exception("local failure"))); - var cut=Render(); + var cut=RenderDashboard(); Assert.Contains("Unavailable",cut.Find("[aria-label='API keys']").TextContent); _keys.ListAsync().Returns(Task.FromResult>([])); cut.Find("[aria-label='API keys'] button").Click(); @@ -72,7 +112,7 @@ public class DashboardStateTests : BunitContext _sites.GetAllSitesAsync().Returns(Task.FromException>(new Exception("local failure")), Task.FromResult>([new("Recovered", "recovered")])); _sites.GetAllDataConnectionsAsync().Returns(connectionRead.Task); - var cut = Render(); + var cut = RenderDashboard(); Assert.Contains("Unavailable", cut.Find("[aria-label='Sites configured']").TextContent); Assert.Contains("Loading", cut.Find("[aria-label='Data connections configured']").TextContent); // Model two already-dispatched retries without relying on a stale DOM node. @@ -98,7 +138,7 @@ public class DashboardStateTests : BunitContext { var pending=new TaskCompletionSource>(TaskCreationOptions.RunContinuationsAsynchronously); _keys.ListAsync().Returns(pending.Task); - var cut=Render(); + var cut=RenderDashboard(); Assert.Contains("Loading",cut.Find("[aria-label='API keys']").TextContent); Assert.Contains("2",cut.Find("[aria-label='Sites configured']").TextContent); await cut.InvokeAsync(()=>pending.SetResult([])); diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs index ee40266c..99669941 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Pages/HealthPageTests.cs @@ -755,6 +755,60 @@ public class HealthPageTests : BunitContext }); } + /// Actionable observations precede healthy entries and use stable display-name ordering. + [Fact] + public void SiteCards_PrioritizeOfflineThenWarningsAndMissingReports() + { + var now = DateTimeOffset.UtcNow; + SiteHealthState Observed(string id, bool online = true, bool stale = false) => new() + { + SiteId = id, IsOnline = online, IsMetricsStale = stale, + LastHeartbeatAt = now, LastReportReceivedAt = now, + LatestReport = ReportWithReconciler(id, true) + }; + SeedStates(Observed("healthy-a"), Observed("offline-z", false), Observed("warning-b", stale: true), + Observed("offline-a", false), new SiteHealthState { SiteId = "unknown", IsOnline = true, LastHeartbeatAt = now }); + var cut = RenderHealthPage(); + cut.WaitForAssertion(() => Assert.Equal( + new[] { "offline-a", "offline-z", "warning-b", "unknown", "healthy-a" }, + cut.FindAll("[data-site-id]").Select(e => e.GetAttribute("data-site-id")).ToArray())); + } + + /// Within a priority group, display name wins over machine-id order. + [Fact] + public void SiteCards_UseDisplayNameThenStableIdentifierWithinPriority() + { + var repo = Substitute.For(); + repo.GetAllSitesAsync(Arg.Any()).Returns(Task.FromResult>([ + new("Zulu", "a-id"), new("Alpha", "z-id"), new("Alpha", "b-id")])); + Services.AddSingleton(repo); + SeedStates(new SiteHealthState { SiteId = "a-id", IsOnline = false }, + new SiteHealthState { SiteId = "z-id", IsOnline = false }, + new SiteHealthState { SiteId = "b-id", IsOnline = false }); + var cut = RenderHealthPage(); + cut.WaitForAssertion(() => Assert.Equal(new[] { "b-id", "z-id", "a-id" }, + cut.FindAll("[data-site-id]").Select(e => e.GetAttribute("data-site-id")).ToArray())); + } + + /// Heartbeat-only sites retain known liveness but never claim observed healthy metrics. + [Fact] + public void MissingReport_IsUnknownAndIntervalErrorsAreNamedHonestly() + { + SeedStates(new SiteHealthState { SiteId = "heartbeat-only", IsOnline = true, LastHeartbeatAt = DateTimeOffset.UtcNow }, + new SiteHealthState { SiteId = "observed", IsOnline = true, LastHeartbeatAt = DateTimeOffset.UtcNow, + LatestReport = ReportWithReconciler("observed", true) with { ScriptErrorCount = 2 } }); + var cut = RenderHealthPage(); + cut.WaitForAssertion(() => + { + var unknown = cut.Find("[data-site-id='heartbeat-only']"); + Assert.Contains("Metrics unknown", unknown.TextContent); + Assert.Contains("Online", unknown.TextContent); + Assert.DoesNotContain("Offline", unknown.TextContent); + Assert.Contains("Sites with errors in last report interval", cut.Markup); + Assert.DoesNotContain("Sites with active errors", cut.Markup); + }); + } + // Re-seeds the aggregator substitute with fully-specified states (as opposed // to SeedSites' minimal online placeholders). private void SeedStates(params SiteHealthState[] states)