From 7b4b0d517ddb170e411fd4df6f2c589381d64b34 Mon Sep 17 00:00:00 2001 From: Patrick Ritchie Date: Mon, 28 Sep 2026 12:39:16 -0400 Subject: [PATCH 1/2] feat(agent-webui): add web-ui module for browsing data and editing agent configuration Add MTConnect.NET-AgentModule-WebUI, an agent module (`web-ui`) that hosts a browser UI on its own HttpListener (default http://localhost:5080): - Overview: agent info, buffer state, devices with data item and per-device observation counts - Data: device/component tree, current observations with filter, auto refresh and sortable columns, recent history per data item - Assets: asset list with MTConnectAssets XML detail - Configuration: edit agent.config.yaml with YAML validation; the previous file is kept as .bak and the agent restarts via its file watcher - Links to the raw MTConnect documents served by the http-server module, the MTConnect.NET documentation and GitHub The page and Roboto / Roboto Mono fonts (SIL OFL 1.1) are embedded in the assembly so the UI works without internet access. Binds to localhost by default since the UI has no authentication; configuration editing can be disabled with allowConfigurationEdit: false. Reference the module from MTConnect.NET-Applications-Agents, add it to the solution, enable it in the sample agent.config.yaml and document it (commented out) in agent.config.default.yaml. Co-Authored-By: Claude Opus 5.5 --- MTConnect.NET.sln | 11 + agent/MTConnect.NET-Agent/agent.config.yaml | 3 + .../MTConnect.NET-Applications-Agents.csproj | 1 + .../agent.config.default.yaml | 5 + .../MTConnect.NET-AgentModule-WebUI.csproj | 65 ++ .../MTConnect.NET-AgentModule-WebUI/Module.cs | 78 ++ .../README-Nuget.md | 34 + .../MTConnect.NET-AgentModule-WebUI/README.md | 34 + .../WebUiModuleConfiguration.cs | 45 + .../WebUiServer.cs | 546 +++++++++++ .../wwwroot/fonts/LICENSE-Roboto.txt | 93 ++ .../wwwroot/fonts/LICENSE-RobotoMono.txt | 93 ++ .../fonts/roboto-latin-ext-wght-normal.woff2 | Bin 0 -> 29392 bytes .../fonts/roboto-latin-wght-normal.woff2 | Bin 0 -> 43136 bytes .../roboto-mono-latin-ext-wght-normal.woff2 | Bin 0 -> 22916 bytes .../fonts/roboto-mono-latin-wght-normal.woff2 | Bin 0 -> 32796 bytes .../wwwroot/index.html | 871 ++++++++++++++++++ 17 files changed, 1879 insertions(+) create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/MTConnect.NET-AgentModule-WebUI.csproj create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/Module.cs create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/README-Nuget.md create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/README.md create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiModuleConfiguration.cs create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiServer.cs create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-Roboto.txt create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-RobotoMono.txt create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-ext-wght-normal.woff2 create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-wght-normal.woff2 create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-mono-latin-ext-wght-normal.woff2 create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-mono-latin-wght-normal.woff2 create mode 100644 agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html diff --git a/MTConnect.NET.sln b/MTConnect.NET.sln index 9bf4d7374..a1ef3b9fe 100644 --- a/MTConnect.NET.sln +++ b/MTConnect.NET.sln @@ -83,6 +83,8 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MTConnect.NET-AgentModule-HttpServer", "agent\Modules\MTConnect.NET-AgentModule-HttpServer\MTConnect.NET-AgentModule-HttpServer.csproj", "{7025F1F6-F914-4830-8171-30872F184918}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MTConnect.NET-AgentModule-ShdrAdapter", "agent\Modules\MTConnect.NET-AgentModule-ShdrAdapter\MTConnect.NET-AgentModule-ShdrAdapter.csproj", "{B6AAE7CE-AEBF-4F1A-929F-01665E85109E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MTConnect.NET-AgentModule-WebUI", "agent\Modules\MTConnect.NET-AgentModule-WebUI\MTConnect.NET-AgentModule-WebUI.csproj", "{0443E446-52DA-4812-B8BD-F2555B5AD7C8}" +EndProject EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MTConnect.NET-AdapterModule-MQTT", "adapter\Modules\MTConnect.NET-AdapterModule-MQTT\MTConnect.NET-AdapterModule-MQTT.csproj", "{BEBFD8B9-5448-49F9-BC92-C98564AA7C72}" EndProject @@ -336,13 +338,21 @@ Global {7025F1F6-F914-4830-8171-30872F184918}.Release|Any CPU.ActiveCfg = Release|Any CPU {7025F1F6-F914-4830-8171-30872F184918}.Release|Any CPU.Build.0 = Release|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Docker|Any CPU.ActiveCfg = Debug|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Docker|Any CPU.ActiveCfg = Debug|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Docker|Any CPU.Build.0 = Debug|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Docker|Any CPU.Build.0 = Debug|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Package|Any CPU.ActiveCfg = Package|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Package|Any CPU.ActiveCfg = Package|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Package|Any CPU.Build.0 = Package|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Package|Any CPU.Build.0 = Package|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6AAE7CE-AEBF-4F1A-929F-01665E85109E}.Release|Any CPU.Build.0 = Release|Any CPU + {0443E446-52DA-4812-B8BD-F2555B5AD7C8}.Release|Any CPU.Build.0 = Release|Any CPU {BEBFD8B9-5448-49F9-BC92-C98564AA7C72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEBFD8B9-5448-49F9-BC92-C98564AA7C72}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEBFD8B9-5448-49F9-BC92-C98564AA7C72}.Docker|Any CPU.ActiveCfg = Debug|Any CPU @@ -552,6 +562,7 @@ Global {2104A3F5-A157-4763-8B90-38CD103D93D8} = {0F01D2F5-0CFA-4DAE-A0FD-5733D291F6FB} {7025F1F6-F914-4830-8171-30872F184918} = {0F01D2F5-0CFA-4DAE-A0FD-5733D291F6FB} {B6AAE7CE-AEBF-4F1A-929F-01665E85109E} = {0F01D2F5-0CFA-4DAE-A0FD-5733D291F6FB} + {0443E446-52DA-4812-B8BD-F2555B5AD7C8} = {0F01D2F5-0CFA-4DAE-A0FD-5733D291F6FB} {BEBFD8B9-5448-49F9-BC92-C98564AA7C72} = {494ACCF3-8FB7-429D-9119-92F7DD646B5F} {D2125645-0149-4D2D-BBF6-5E36E6EBB6C1} = {494ACCF3-8FB7-429D-9119-92F7DD646B5F} {B4A1AFBE-5D57-45BA-B735-A2C2C20A971C} = {B7CCD58C-A3F3-43BE-BBF8-2B20D118C39D} diff --git a/agent/MTConnect.NET-Agent/agent.config.yaml b/agent/MTConnect.NET-Agent/agent.config.yaml index 7f525d95f..fe56b8207 100644 --- a/agent/MTConnect.NET-Agent/agent.config.yaml +++ b/agent/MTConnect.NET-Agent/agent.config.yaml @@ -9,6 +9,9 @@ processors: # - Modules - modules: +- web-ui: # - Add Web UI module (browse data and edit this configuration at http://localhost:5080) + port: 5080 + - http-server: # - Add HTTP Server module port: 5000 indentOutput: true diff --git a/agent/MTConnect.NET-Applications-Agents/MTConnect.NET-Applications-Agents.csproj b/agent/MTConnect.NET-Applications-Agents/MTConnect.NET-Applications-Agents.csproj index 2b8fd4748..401036c9a 100644 --- a/agent/MTConnect.NET-Applications-Agents/MTConnect.NET-Applications-Agents.csproj +++ b/agent/MTConnect.NET-Applications-Agents/MTConnect.NET-Applications-Agents.csproj @@ -58,6 +58,7 @@ + diff --git a/agent/MTConnect.NET-Applications-Agents/agent.config.default.yaml b/agent/MTConnect.NET-Applications-Agents/agent.config.default.yaml index 478ec0fb9..95ba7d572 100644 --- a/agent/MTConnect.NET-Applications-Agents/agent.config.default.yaml +++ b/agent/MTConnect.NET-Applications-Agents/agent.config.default.yaml @@ -1,6 +1,11 @@ # - Modules - modules: +# - web-ui: # - Add Web UI module (browse data and edit this configuration at http://localhost:5080) +# server: localhost +# port: 5080 +# allowConfigurationEdit: true + - http-server: # - Add HTTP Server module # hostname: localhost port: 5000 diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/MTConnect.NET-AgentModule-WebUI.csproj b/agent/Modules/MTConnect.NET-AgentModule-WebUI/MTConnect.NET-AgentModule-WebUI.csproj new file mode 100644 index 000000000..e4fe2410c --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/MTConnect.NET-AgentModule-WebUI.csproj @@ -0,0 +1,65 @@ + + + + net8.0 + + + net461;net462;net47;net471;net472;net48;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 + false + None + true + + + net461;net462;net47;net471;net472;net48;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 + true + + + + MTConnect + Debug;Release;Package + + MTConnect.NET-AgentModule-WebUI hosts a lightweight browser user interface for the MTConnectAgentApplication class in the MTConnect.NET-Applications-Agents library. It lets a user browse Devices, current and sampled Observations, and Assets, and edit the Agent configuration file. Supports .NET Framework 4.6.1 up to .NET 10 + README-Nuget.md + + + true + + + true + + + true + snupkg + + + + true + + + + + + + + + + + + + True + \licenses\ + + + + + + True + \ + + + True + \ + + + + diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/Module.cs b/agent/Modules/MTConnect.NET-AgentModule-WebUI/Module.cs new file mode 100644 index 000000000..0e17fce39 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/Module.cs @@ -0,0 +1,78 @@ +// Copyright (c) 2026 TrakHound Inc., All Rights Reserved. +// TrakHound Inc. licenses this file to you under the MIT license. + +using MTConnect.Agents; +using MTConnect.Configurations; +using MTConnect.Logging; + +namespace MTConnect.Modules.WebUI +{ + /// + /// Agent module that hosts a browser user interface for the Agent. + /// The UI lets a user browse Devices, current / sampled Observations + /// and Assets, and view or edit the Agent configuration file. + /// + public class Module : MTConnectAgentModule + { + /// + /// Token used in agent.config.yaml to bind this module + /// (- web-ui:). + /// + public const string ConfigurationTypeId = "web-ui"; + private const string ModuleId = "Web UI"; + + private readonly WebUiModuleConfiguration _configuration; + private WebUiServer _server; + + + /// + /// Initialises the module and binds the supplied controller- + /// configuration payload to . + /// + /// Agent broker the UI reads from. + /// Raw configuration payload + /// bound to . + public Module(IMTConnectAgentBroker mtconnectAgent, object controllerConfiguration) : base(mtconnectAgent) + { + Id = ModuleId; + + _configuration = AgentApplicationConfiguration.GetConfiguration(controllerConfiguration); + if (_configuration == null) _configuration = new WebUiModuleConfiguration(); + } + + + /// + /// Module lifecycle hook: creates the UI web server before the Agent + /// loads its devices so the per-Device Observation counts include + /// the Observations added while the devices initialize. + /// + /// Inherited flag; unused by + /// this module. + protected override void OnStartBeforeLoad(bool initializeDataItems) + { + _server = new WebUiServer(_configuration, Agent); + } + + /// + /// Module lifecycle hook: starts the UI web server once the Agent + /// has loaded its devices. + /// + /// Inherited flag; unused by + /// this module. + protected override void OnStartAfterLoad(bool initializeDataItems) + { + if (_server == null) _server = new WebUiServer(_configuration, Agent); + _server.LogReceived += (s, message) => Log(MTConnectLogLevel.Information, message); + _server.ErrorReceived += (s, message) => Log(MTConnectLogLevel.Warning, message); + _server.Start(); + } + + /// + /// Module lifecycle hook: stops the UI web server. + /// + protected override void OnStop() + { + if (_server != null) _server.Stop(); + } + } +} diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/README-Nuget.md b/agent/Modules/MTConnect.NET-AgentModule-WebUI/README-Nuget.md new file mode 100644 index 000000000..e8e874fb4 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/README-Nuget.md @@ -0,0 +1,34 @@ +![MTConnect.NET Logo](https://raw.githubusercontent.com/TrakHound/MTConnect.NET/master/img/logo.png) + +# MTConnect Web UI Agent Module +This Agent Module hosts a browser user interface for the MTConnect.NET Agent. It can be used to: + +* View Agent information and buffer state +* Browse Devices / Components and their current Observations (with auto refresh) +* View the recent history of any Data Item +* Browse Assets and view them as MTConnectAssets XML +* View and edit the Agent configuration file (`agent.config.yaml`) + +## Configuration +```yaml +modules: + - web-ui: + server: localhost + port: 5080 + allowConfigurationEdit: true +``` + +* `server` - The hostname to bind to. Defaults to `localhost` so the UI is only reachable from the Agent machine. Set to `*` to listen on all interfaces (on Windows this requires administrator rights or a `netsh http add urlacl` reservation). + +* `port` - The port the UI listens on. Default is `5080`. + +* `allowConfigurationEdit` - Sets whether the Agent configuration file can be saved from the UI. Default is `true`. When `false` the configuration is shown read-only. + +Open `http://localhost:5080/` in a browser once the Agent is running. + +The page and its fonts (Roboto and Roboto Mono, licensed under the SIL Open Font License 1.1) are embedded in the module assembly, so the UI makes no requests outside the Agent and works on networks without internet access. + +## Applying configuration changes +Saving validates the YAML, keeps a copy of the previous file as `agent.config.yaml.bak`, and writes the new file. When `monitorConfigurationFiles` is enabled (the default) the Agent detects the change and restarts itself to apply it; otherwise restart the Agent manually. + +> **Security** - The UI has no authentication. Anyone who can reach it can change the Agent configuration. Keep `server: localhost` or set `allowConfigurationEdit: false` when exposing it on a network. diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/README.md b/agent/Modules/MTConnect.NET-AgentModule-WebUI/README.md new file mode 100644 index 000000000..e8e874fb4 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/README.md @@ -0,0 +1,34 @@ +![MTConnect.NET Logo](https://raw.githubusercontent.com/TrakHound/MTConnect.NET/master/img/logo.png) + +# MTConnect Web UI Agent Module +This Agent Module hosts a browser user interface for the MTConnect.NET Agent. It can be used to: + +* View Agent information and buffer state +* Browse Devices / Components and their current Observations (with auto refresh) +* View the recent history of any Data Item +* Browse Assets and view them as MTConnectAssets XML +* View and edit the Agent configuration file (`agent.config.yaml`) + +## Configuration +```yaml +modules: + - web-ui: + server: localhost + port: 5080 + allowConfigurationEdit: true +``` + +* `server` - The hostname to bind to. Defaults to `localhost` so the UI is only reachable from the Agent machine. Set to `*` to listen on all interfaces (on Windows this requires administrator rights or a `netsh http add urlacl` reservation). + +* `port` - The port the UI listens on. Default is `5080`. + +* `allowConfigurationEdit` - Sets whether the Agent configuration file can be saved from the UI. Default is `true`. When `false` the configuration is shown read-only. + +Open `http://localhost:5080/` in a browser once the Agent is running. + +The page and its fonts (Roboto and Roboto Mono, licensed under the SIL Open Font License 1.1) are embedded in the module assembly, so the UI makes no requests outside the Agent and works on networks without internet access. + +## Applying configuration changes +Saving validates the YAML, keeps a copy of the previous file as `agent.config.yaml.bak`, and writes the new file. When `monitorConfigurationFiles` is enabled (the default) the Agent detects the change and restarts itself to apply it; otherwise restart the Agent manually. + +> **Security** - The UI has no authentication. Anyone who can reach it can change the Agent configuration. Keep `server: localhost` or set `allowConfigurationEdit: false` when exposing it on a network. diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiModuleConfiguration.cs b/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiModuleConfiguration.cs new file mode 100644 index 000000000..487ce1dba --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiModuleConfiguration.cs @@ -0,0 +1,45 @@ +// Copyright (c) 2026 TrakHound Inc., All Rights Reserved. +// TrakHound Inc. licenses this file to you under the MIT license. + +namespace MTConnect.Configurations +{ + /// + /// Configuration shape for the Web UI agent module. Controls the + /// address the UI listens on and whether the Agent configuration + /// file may be edited from the browser. + /// + public class WebUiModuleConfiguration + { + /// + /// The hostname the UI binds to. Defaults to localhost so the + /// UI (and its configuration editor) is only reachable from the + /// machine the Agent runs on. Use * or + to listen on + /// every interface (may require elevated permissions on Windows). + /// + public string Server { get; set; } + + /// + /// The port the UI listens on. + /// + public int Port { get; set; } + + /// + /// Gets or Sets whether the Agent configuration file can be edited + /// and saved from the UI. When false the configuration is + /// shown read-only. + /// + public bool AllowConfigurationEdit { get; set; } + + + /// + /// Initialises a new instance bound to localhost:5080 with + /// configuration editing enabled. + /// + public WebUiModuleConfiguration() + { + Server = "localhost"; + Port = 5080; + AllowConfigurationEdit = true; + } + } +} diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiServer.cs b/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiServer.cs new file mode 100644 index 000000000..08ee3d137 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/WebUiServer.cs @@ -0,0 +1,546 @@ +// Copyright (c) 2026 TrakHound Inc., All Rights Reserved. +// TrakHound Inc. licenses this file to you under the MIT license. + +using MTConnect.Agents; +using MTConnect.Configurations; +using MTConnect.Devices; +using MTConnect.Formatters; +using MTConnect.Observations; +using MTConnect.Observations.Output; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using YamlDotNet.Core; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace MTConnect.Modules.WebUI +{ + /// + /// Minimal -based web server that serves the + /// embedded UI page and the JSON API it calls. + /// + /// + /// Routes: + /// + /// GET / – the UI page + /// GET /fonts/{name}.woff2 – the embedded Roboto / Roboto Mono fonts + /// GET /api/agent – Agent information and buffer state + /// GET /api/devices – Device / Component / DataItem tree + /// GET /api/current?device= – current Observations for a Device + /// GET /api/sample?device=&dataItemId=&count= – most recent Observations + /// GET /api/assets?device= – Asset list + /// GET /api/asset?id= – a single Asset as an MTConnectAssets XML document + /// GET /api/config / PUT /api/config – read / save the Agent configuration file + /// + /// + public class WebUiServer + { + private const string IndexResourceName = "MTConnect.WebUI.index.html"; + private const string FontResourcePrefix = "MTConnect.WebUI.fonts."; + private const int MaxSampleCount = 1000; + + private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + private readonly WebUiModuleConfiguration _configuration; + private readonly IMTConnectAgentBroker _agent; + private readonly ConcurrentDictionary _observationCounts = new ConcurrentDictionary(); + private HttpListener _listener; + private CancellationTokenSource _stop; + + + /// + /// Raised with an informational message (for example the listening address). + /// + public event EventHandler LogReceived; + + /// + /// Raised with a message when the listener or a request fails. + /// + public event EventHandler ErrorReceived; + + + /// + /// Initialises a new server for the given configuration and Agent. + /// + /// Listen address and edit policy. + /// Agent broker the API reads from. + public WebUiServer(WebUiModuleConfiguration configuration, IMTConnectAgentBroker agent) + { + _configuration = configuration ?? new WebUiModuleConfiguration(); + _agent = agent; + + // Count Observations per Device from the moment the server is created + if (_agent != null) _agent.ObservationAdded += ObservationAdded; + } + + + /// + /// Starts listening on a background task. Returns immediately. + /// + public void Start() + { + var host = _configuration.Server; + if (string.IsNullOrEmpty(host) || host == "*" || host == "0.0.0.0") host = "+"; + var prefix = $"http://{host}:{_configuration.Port}/"; + + try + { + _stop = new CancellationTokenSource(); + _listener = new HttpListener(); + _listener.Prefixes.Add(prefix); + _listener.Start(); + + LogReceived?.Invoke(this, $"Web UI listening at {prefix.Replace("+", "localhost")}"); + + _ = Task.Run(() => Listen(_stop.Token)); + } + catch (Exception ex) + { + ErrorReceived?.Invoke(this, $"Web UI failed to start at {prefix} : {ex.Message}"); + } + } + + /// + /// Stops the listener and releases the port. + /// + public void Stop() + { + if (_agent != null) _agent.ObservationAdded -= ObservationAdded; + + try + { + if (_stop != null) _stop.Cancel(); + if (_listener != null) _listener.Close(); + } + catch { } + } + + + private void ObservationAdded(object sender, IObservation observation) + { + if (observation != null && observation.DeviceUuid != null) + { + _observationCounts.AddOrUpdate(observation.DeviceUuid, 1, (key, count) => count + 1); + } + } + + private async Task Listen(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested && _listener.IsListening) + { + HttpListenerContext context; + try + { + context = await _listener.GetContextAsync(); + } + catch + { + // Listener was closed + break; + } + + _ = Task.Run(() => HandleRequest(context)); + } + } + + private void HandleRequest(HttpListenerContext context) + { + var request = context.Request; + var response = context.Response; + + try + { + var path = request.Url.AbsolutePath.TrimEnd('/').ToLowerInvariant(); + var method = request.HttpMethod; + + if (method == "GET" && (path == "" || path == "/index.html")) + { + WriteIndex(response); + } + else if (method == "GET" && path.StartsWith("/fonts/")) WriteFont(response, path.Substring("/fonts/".Length)); + else if (method == "GET" && path == "/api/agent") WriteJson(response, GetAgentInfo()); + else if (method == "GET" && path == "/api/devices") WriteJson(response, GetDevices()); + else if (method == "GET" && path == "/api/current") WriteJson(response, GetCurrent(request.QueryString["device"])); + else if (method == "GET" && path == "/api/sample") WriteJson(response, GetSample(request.QueryString["device"], request.QueryString["dataItemId"], request.QueryString["count"])); + else if (method == "GET" && path == "/api/assets") WriteJson(response, GetAssets(request.QueryString["device"])); + else if (method == "GET" && path == "/api/asset") WriteAsset(response, request.QueryString["id"]); + else if (method == "GET" && path == "/api/config") WriteJson(response, GetConfiguration()); + else if (method == "PUT" && path == "/api/config") SaveConfiguration(request, response); + else WriteJson(response, new { error = "Not Found" }, 404); + } + catch (Exception ex) + { + ErrorReceived?.Invoke(this, $"Web UI request error ({request.HttpMethod} {request.Url.AbsolutePath}) : {ex.Message}"); + try { WriteJson(response, new { error = ex.Message }, 500); } catch { } + } + finally + { + try { response.Close(); } catch { } + } + } + + + #region "API" + + private object GetAgentInfo() + { + var configuration = _agent.Configuration; + var applicationConfiguration = configuration as IAgentApplicationConfiguration; + + return new + { + uuid = _agent.Uuid, + instanceId = _agent.InstanceId, + sender = _agent.Sender, + version = _agent.Version?.ToString(), + mtconnectVersion = _agent.MTConnectVersion?.ToString(), + deviceModelChangeTime = _agent.DeviceModelChangeTime, + bufferSize = _agent.BufferSize, + firstSequence = _agent.FirstSequence, + lastSequence = _agent.LastSequence, + nextSequence = _agent.NextSequence, + assetBufferSize = _agent.AssetBufferSize, + assetCount = _agent.AssetCount, + configurationPath = configuration?.Path, + monitorConfigurationFiles = applicationConfiguration?.MonitorConfigurationFiles ?? false, + allowConfigurationEdit = _configuration.AllowConfigurationEdit, + observationCounts = _observationCounts.ToDictionary(o => o.Key, o => o.Value), + mtconnectServer = GetMTConnectServer(applicationConfiguration) + }; + } + + /// + /// Minimal view of an http-server module entry, used to link to the + /// Agent's MTConnect REST API without referencing the HTTP server assembly. + /// + private class HttpServerModuleEntry + { + public int Port { get; set; } = 5000; + public string Server { get; set; } + public object Tls { get; set; } + } + + private static object GetMTConnectServer(IAgentApplicationConfiguration configuration) + { + // Link to the first configured HTTP server module (the Agent's MTConnect REST API) + var server = configuration?.GetModules("http-server")?.FirstOrDefault(); + if (server == null) return null; + + return new + { + port = server.Port, + server = server.Server, + tls = server.Tls != null + }; + } + + private object GetDevices() + { + var devices = _agent.GetDevices(); + if (devices == null) return new object[0]; + + return devices.Select(device => new + { + id = device.Id, + uuid = device.Uuid, + name = device.Name, + type = device.Type, + dataItems = ToDataItems(device.DataItems), + components = ToComponents(device.Components) + }).ToList(); + } + + private static IEnumerable ToComponents(IEnumerable components) + { + if (components == null) return new object[0]; + + return components.Select(component => new + { + id = component.Id, + name = component.Name, + type = component.Type, + dataItems = ToDataItems(component.DataItems), + components = ToComponents(component.Components) + }).ToList(); + } + + private static IEnumerable ToDataItems(IEnumerable dataItems) + { + if (dataItems == null) return new object[0]; + + return dataItems.Select(dataItem => new + { + id = dataItem.Id, + name = dataItem.Name, + type = dataItem.Type, + subType = dataItem.SubType, + category = dataItem.Category.ToString(), + units = dataItem.Units + }).ToList(); + } + + private object GetCurrent(string deviceKey) + { + var observations = string.IsNullOrEmpty(deviceKey) + ? _agent.GetCurrentObservations() + : _agent.GetCurrentObservations(deviceKey); + + return ToObservations(observations); + } + + private object GetSample(string deviceKey, string dataItemId, string countText) + { + if (string.IsNullOrEmpty(deviceKey)) return new object[0]; + + var count = 100; + if (int.TryParse(countText, out var parsedCount)) count = Math.Max(1, Math.Min(MaxSampleCount, parsedCount)); + + var dataItemIds = string.IsNullOrEmpty(dataItemId) ? null : new[] { dataItemId }; + var first = _agent.FirstSequence; + var last = _agent.LastSequence; + if (last < first) return new object[0]; + + // Walk backwards from the end of the buffer with a growing window + // until enough Observations are found (or the whole buffer is read) + var results = new List(); + ulong window = (ulong)count; + while (true) + { + var from = last >= first + window ? last - window + 1 : first; + + var document = dataItemIds != null + ? _agent.GetDeviceStreamsResponseDocument(deviceKey, dataItemIds, from, last, (uint)Math.Min(window, uint.MaxValue)) + : _agent.GetDeviceStreamsResponseDocument(deviceKey, from, last, (uint)Math.Min(window, uint.MaxValue)); + + results.Clear(); + if (document != null && document.Streams != null) + { + foreach (var stream in document.Streams) + { + if (stream.Observations != null) results.AddRange(stream.Observations); + } + } + + if (results.Count >= count || from <= first) break; + window *= 10; + } + + return ToObservations(results.OrderByDescending(o => o.Sequence).Take(count)); + } + + private static IEnumerable ToObservations(IEnumerable observations) + { + if (observations == null) return new object[0]; + + return observations.Select(observation => new + { + deviceUuid = observation.DeviceUuid, + dataItemId = observation.DataItemId, + name = observation.Name, + type = observation.Type, + subType = observation.SubType, + category = observation.Category.ToString(), + representation = observation.Representation.ToString(), + sequence = observation.Sequence, + timestamp = observation.Timestamp, + values = observation.Values != null + ? observation.Values.Where(v => v.Key != null).GroupBy(v => v.Key).ToDictionary(g => g.Key, g => g.First().Value) + : new Dictionary() + }).ToList(); + } + + private object GetAssets(string deviceKey) + { + var assets = string.IsNullOrEmpty(deviceKey) ? _agent.GetAssets() : _agent.GetAssets(deviceKey); + if (assets == null) return new object[0]; + + return assets.Select(asset => new + { + assetId = asset.AssetId, + type = asset.Type, + deviceUuid = asset.DeviceUuid, + timestamp = asset.Timestamp, + removed = asset.Removed + }).ToList(); + } + + private void WriteAsset(HttpListenerResponse response, string assetId) + { + if (string.IsNullOrEmpty(assetId)) + { + WriteJson(response, new { error = "Missing 'id' parameter" }, 400); + return; + } + + var document = _agent.GetAssetsResponseDocument(new[] { assetId }); + var options = new List> { new KeyValuePair("indentOutput", "true") }; + var result = ResponseDocumentFormatter.Format(DocumentFormat.XML, document, options); + if (!result.Success || result.Content == null) + { + WriteJson(response, new { error = "Unable to format Asset" }, 500); + return; + } + + using (var reader = new StreamReader(result.Content)) + { + WriteText(response, reader.ReadToEnd(), "application/xml; charset=utf-8"); + } + } + + private object GetConfiguration() + { + var path = _agent.Configuration?.Path; + string content = null; + if (!string.IsNullOrEmpty(path) && File.Exists(path)) content = File.ReadAllText(path); + + return new + { + path, + content, + editable = _configuration.AllowConfigurationEdit && !string.IsNullOrEmpty(path) + }; + } + + private void SaveConfiguration(HttpListenerRequest request, HttpListenerResponse response) + { + if (!_configuration.AllowConfigurationEdit) + { + WriteJson(response, new { error = "Configuration editing is disabled (allowConfigurationEdit: false)" }, 403); + return; + } + + var path = _agent.Configuration?.Path; + if (string.IsNullOrEmpty(path)) + { + WriteJson(response, new { error = "The Agent was not loaded from a configuration file" }, 400); + return; + } + + if (!path.EndsWith(".yaml", StringComparison.OrdinalIgnoreCase) && !path.EndsWith(".yml", StringComparison.OrdinalIgnoreCase)) + { + WriteJson(response, new { error = "Only YAML configuration files can be edited from the UI" }, 400); + return; + } + + string content; + using (var reader = new StreamReader(request.InputStream, request.ContentEncoding ?? Encoding.UTF8)) + { + content = reader.ReadToEnd(); + } + + if (string.IsNullOrWhiteSpace(content)) + { + WriteJson(response, new { error = "Configuration is empty" }, 400); + return; + } + + // Validate the YAML with the same settings the Agent reads it with + try + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(CamelCaseNamingConvention.Instance) + .IgnoreUnmatchedProperties() + .Build(); + + deserializer.Deserialize(content); + } + catch (YamlException ex) + { + WriteJson(response, new { error = $"Invalid configuration (line {ex.Start.Line}, column {ex.Start.Column}) : {ex.InnerException?.Message ?? ex.Message}" }, 400); + return; + } + + // Keep a copy of the previous file before overwriting it + if (File.Exists(path)) File.Copy(path, path + ".bak", true); + File.WriteAllText(path, content, new UTF8Encoding(false)); + + LogReceived?.Invoke(this, $"Agent configuration saved from Web UI ({path})"); + + var applicationConfiguration = _agent.Configuration as IAgentApplicationConfiguration; + WriteJson(response, new + { + saved = true, + restartPending = applicationConfiguration?.MonitorConfigurationFiles ?? false + }); + } + + #endregion + + #region "Response Writers" + + private static void WriteIndex(HttpListenerResponse response) + { + using (var stream = typeof(WebUiServer).GetTypeInfo().Assembly.GetManifestResourceStream(IndexResourceName)) + { + if (stream == null) + { + WriteJson(response, new { error = "UI resource not found" }, 500); + return; + } + + using (var reader = new StreamReader(stream)) + { + WriteText(response, reader.ReadToEnd(), "text/html; charset=utf-8"); + } + } + } + + private static void WriteFont(HttpListenerResponse response, string fileName) + { + // Only names of embedded .woff2 resources resolve; anything else is a 404 + Stream stream = null; + if (fileName.EndsWith(".woff2") && fileName.IndexOf('/') < 0) + { + stream = typeof(WebUiServer).GetTypeInfo().Assembly.GetManifestResourceStream(FontResourcePrefix + fileName); + } + + if (stream == null) + { + WriteJson(response, new { error = "Not Found" }, 404); + return; + } + + using (stream) + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + var bytes = memoryStream.ToArray(); + + response.StatusCode = 200; + response.ContentType = "font/woff2"; + response.Headers["Cache-Control"] = "public, max-age=86400"; + response.ContentLength64 = bytes.Length; + response.OutputStream.Write(bytes, 0, bytes.Length); + } + } + + private static void WriteJson(HttpListenerResponse response, object value, int statusCode = 200) + { + WriteText(response, JsonSerializer.Serialize(value, _jsonOptions), "application/json; charset=utf-8", statusCode); + } + + private static void WriteText(HttpListenerResponse response, string text, string contentType, int statusCode = 200) + { + var bytes = Encoding.UTF8.GetBytes(text ?? ""); + response.StatusCode = statusCode; + response.ContentType = contentType; + response.Headers["Cache-Control"] = "no-store"; + response.ContentLength64 = bytes.Length; + response.OutputStream.Write(bytes, 0, bytes.Length); + } + + #endregion + } +} diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-Roboto.txt b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-Roboto.txt new file mode 100644 index 000000000..e96f4bc8e --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-Roboto.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Roboto Project Authors (https://github.com/googlefonts/roboto-classic) Roboto-Italic[wdth,wght].ttf: Copyright 2011 The Roboto Project Authors (https://github.com/googlefonts/roboto-classic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-RobotoMono.txt b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-RobotoMono.txt new file mode 100644 index 000000000..04f5d2a34 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/LICENSE-RobotoMono.txt @@ -0,0 +1,93 @@ +Copyright 2015 The Roboto Mono Project Authors (https://github.com/googlefonts/robotomono) RobotoMono-Italic[wght].ttf: Copyright 2015 The Roboto Mono Project Authors (https://github.com/googlefonts/robotomono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-ext-wght-normal.woff2 b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1ee37693ecbc54436308f7851cd92534c45ba0bb GIT binary patch literal 29392 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≪HK)Jkk15%m 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 bvI<7D559Yq23nvUqHV>OR3D*u761SMWPP$Q literal 0 HcmV?d00001 diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-wght-normal.woff2 b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9b0f14165e44ad80256062baf0e55c163dfbe96b GIT binary patch literal 43136 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

7eh|( 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 literal 0 HcmV?d00001 diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-mono-latin-wght-normal.woff2 b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/fonts/roboto-mono-latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bfa169c30067c4d08aa76dfb11f28526d169c9ea GIT binary patch literal 32796 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 literal 0 HcmV?d00001 diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html new file mode 100644 index 000000000..c34fdd4c9 --- /dev/null +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html @@ -0,0 +1,871 @@ + + + + + +MTConnect.NET Agent + + + + + +
+ +
+
+

Agent

+
+
+
+

Buffer

+
+
+
+

MTConnect Data

+ +
+
+

Devices

+ + + +
NameUUIDTypeData ItemsObservationsMTConnect Data
+
+
+ + +
+
+
+
+
+
+ Current + + + + + +
+
+ + + +
Name / IdTypeSubTypeValueTimestampSeq
+
+
+
+
+ History + + + +
+
+ + + +
TimestampValueSeq
Select an observation to view its recent history
+
+
+
+
+
+ + +
+
+
+ Assets + + + + +
+ + + +
Asset IdTypeDeviceTimestampRemoved
+
+ +
+ + +
+
+
+ Agent Configuration + + + + + +
+ +

+
+
+
+ + + + From 96f990a98269f46ae85991e490e629a89e2c36b7 Mon Sep 17 00:00:00 2001 From: Patrick Ritchie Date: Mon, 28 Sep 2026 13:05:57 -0400 Subject: [PATCH 2/2] style(agent-webui): polish overview layout, scrollbars and data page type - Move the MTConnect Data links panel to the top of the Overview page - Declare color-scheme per theme and style scrollbars with theme tokens so they match the dark theme (with a WebKit fallback) - Use slightly smaller type on the Data page to fit more rows and columns Co-Authored-By: Claude Opus 5.5 --- .../wwwroot/index.html | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html index c34fdd4c9..bfc43efd2 100644 --- a/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html +++ b/agent/Modules/MTConnect.NET-AgentModule-WebUI/wwwroot/index.html @@ -40,6 +40,7 @@ } :root { + color-scheme: light; /* native controls and scrollbars follow the theme */ --bg: #f5f6f8; --panel: #ffffff; --border: #dfe3e8; @@ -51,6 +52,8 @@ --warn: #b35900; --err: #c62828; --code-bg: #f0f2f5; + --scrollbar: #c3c9d1; + --scrollbar-hover: #a3abb6; --font: Roboto, "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif; --font-mono: "Roboto Mono", ui-monospace, Consolas, monospace; --radius: 3px; /* panels */ @@ -58,6 +61,7 @@ } @media (prefers-color-scheme: dark) { :root { + color-scheme: dark; --bg: #111418; --panel: #1a1f25; --border: #2d343c; @@ -69,9 +73,21 @@ --warn: #e3a008; --err: #f26b6b; --code-bg: #14181d; + --scrollbar: #3a424c; + --scrollbar-hover: #4f5965; } } * { box-sizing: border-box; } + + /* Scrollbars: thin, theme-coloured thumb on a transparent track */ + * { scrollbar-width: thin; scrollbar-color: var(--scrollbar) transparent; } + @supports not (scrollbar-color: auto) { + /* Fallback for older WebKit / Chromium browsers */ + ::-webkit-scrollbar { width: 10px; height: 10px; } + ::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background: transparent; } + ::-webkit-scrollbar-thumb { background: var(--scrollbar); border: 2px solid transparent; border-radius: var(--radius-sm); background-clip: padding-box; } + ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-hover); background-clip: padding-box; } + } html, body { height: 100%; } body { margin: 0; @@ -187,6 +203,11 @@ label.check { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); } /* Data browser layout */ + /* Slightly smaller type on the Data page to fit more rows and columns */ + #view-data { font-size: 13px; } + #view-data th { font-size: 11px; } + #view-data .badge { font-size: 10px; } + #view-data .raw-links { font-size: 12px; } .browser { display: grid; grid-template-columns: 280px minmax(0, 1fr); gap: 16px; align-items: start; } .tree { max-height: calc(100vh - 150px); overflow: auto; padding: 8px; } .tree ul { list-style: none; margin: 0; padding-left: 14px; } @@ -282,6 +303,10 @@

MTConnect.NET Agent

+
+

MTConnect Data

+ +

Agent

@@ -290,10 +315,6 @@

Agent

Buffer

-
-

MTConnect Data

- -

Devices

+

MTConnect.NET Agent

+ +
+