diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/DriverEdit.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/DriverEdit.razor index 585b94ab..fc51ca6b 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/DriverEdit.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/DriverEdit.razor @@ -11,6 +11,7 @@ @using System.ComponentModel.DataAnnotations @using ZB.MOM.WW.OtOpcUa.Configuration @using ZB.MOM.WW.OtOpcUa.Configuration.Entities +@using ZB.MOM.WW.OtOpcUa.AdminUI.Components.Shared.Drivers @inject IDbContextFactory DbFactory @inject NavigationManager Nav @@ -35,97 +36,24 @@ else { -
-
@(IsNew ? "Identity" : $"Edit {_form.DriverInstanceId}")
-
-
-
- - + + + @* Driver config (JSON) — inlined; will be replaced by typed forms in Phase 4 *@ +
+
Driver config (JSON)
+
+ -
-
- - -
+ placeholder='{ "endpoint": "10.0.0.42:502", "slaveId": 1 }' /> +
Schemaless per driver type — validated server-side at deploy time. JSON is reformatted on save.
-
-
- - - - - - - - - - - - -
Cannot be changed after creation — drives the actor type that owns this instance.
-
-
- - - @foreach (var ns in _namespaces) - { - - } - -
-
-
- -
- - -
-
-
-
+ -
-
Driver config (JSON)
-
- -
Schemaless per driver type — validated server-side at deploy time. JSON is reformatted on save.
-
-
- -
-
Resilience overrides (optional)
-
- -
Polly pipeline overrides per docs/v2/driver-stability.md — bulkhead, retry counts, breaker thresholds. Null = use the driver type's tier defaults.
-
-
- - @if (!string.IsNullOrWhiteSpace(_error)) - { -
@_error
- } - -
- - Cancel - @if (!IsNew) - { - - } -
+ +
} @@ -135,6 +63,7 @@ else private bool IsNew => string.IsNullOrEmpty(DriverInstanceId); + private DriverIdentitySection.DriverIdentityModel _identityModel = new(); private FormModel _form = new(); private DriverInstance? _existing; private List _namespaces = new(); @@ -152,13 +81,16 @@ else if (IsNew) { - _form = new FormModel + _identityModel = new DriverIdentitySection.DriverIdentityModel { DriverInstanceId = "", Name = "", DriverType = "ModbusTcp", NamespaceId = _namespaces.FirstOrDefault()?.NamespaceId ?? "", Enabled = true, + }; + _form = new FormModel + { DriverConfig = "{}", }; } @@ -168,13 +100,16 @@ else .FirstOrDefaultAsync(d => d.ClusterId == ClusterId && d.DriverInstanceId == DriverInstanceId); if (_existing is not null) { - _form = new FormModel + _identityModel = new DriverIdentitySection.DriverIdentityModel { DriverInstanceId = _existing.DriverInstanceId, Name = _existing.Name, DriverType = _existing.DriverType, NamespaceId = _existing.NamespaceId, Enabled = _existing.Enabled, + }; + _form = new FormModel + { DriverConfig = _existing.DriverConfig, ResilienceConfig = _existing.ResilienceConfig, RowVersion = _existing.RowVersion, @@ -206,19 +141,19 @@ else await using var db = await DbFactory.CreateDbContextAsync(); if (IsNew) { - if (await db.DriverInstances.AnyAsync(d => d.DriverInstanceId == _form.DriverInstanceId)) + if (await db.DriverInstances.AnyAsync(d => d.DriverInstanceId == _identityModel.DriverInstanceId)) { - _error = $"Driver instance '{_form.DriverInstanceId}' already exists."; + _error = $"Driver instance '{_identityModel.DriverInstanceId}' already exists."; return; } db.DriverInstances.Add(new DriverInstance { - DriverInstanceId = _form.DriverInstanceId, + DriverInstanceId = _identityModel.DriverInstanceId, ClusterId = ClusterId, - NamespaceId = _form.NamespaceId, - Name = _form.Name, - DriverType = _form.DriverType, - Enabled = _form.Enabled, + NamespaceId = _identityModel.NamespaceId, + Name = _identityModel.Name, + DriverType = _identityModel.DriverType, + Enabled = _identityModel.Enabled, DriverConfig = normalizedConfig, ResilienceConfig = normalizedResilience, }); @@ -233,9 +168,9 @@ else return; } db.Entry(entity).Property(e => e.RowVersion).OriginalValue = _form.RowVersion; - entity.NamespaceId = _form.NamespaceId; - entity.Name = _form.Name; - entity.Enabled = _form.Enabled; + entity.NamespaceId = _identityModel.NamespaceId; + entity.Name = _identityModel.Name; + entity.Enabled = _identityModel.Enabled; entity.DriverConfig = normalizedConfig; entity.ResilienceConfig = normalizedResilience; } @@ -306,15 +241,6 @@ else private sealed class FormModel { - [Required, RegularExpression("^[A-Za-z0-9_-]+$", ErrorMessage = "Use letters, digits, dash, underscore.")] - public string DriverInstanceId { get; set; } = ""; - [Required] - public string Name { get; set; } = ""; - [Required] - public string DriverType { get; set; } = "ModbusTcp"; - [Required] - public string NamespaceId { get; set; } = ""; - public bool Enabled { get; set; } = true; [Required] public string DriverConfig { get; set; } = "{}"; public string? ResilienceConfig { get; set; }