feat(centralui): scaffold <OpcUaBrowserDialog/> modal

This commit is contained in:
Joseph Doherty
2026-05-28 11:49:59 -04:00
parent d727a6925b
commit 4fc546383f
@@ -0,0 +1,92 @@
@using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Protocol
@using ZB.MOM.WW.ScadaBridge.Commons.Messages.Management
@using ZB.MOM.WW.ScadaBridge.CentralUI.Services
@inject IOpcUaBrowseService BrowseService
@if (_isVisible)
{
<div class="modal show d-block" tabindex="-1" role="dialog" style="background-color: rgba(0,0,0,0.5);">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Browse OPC UA — @ConnectionName</h5>
<button type="button" class="btn-close" @onclick="Cancel"></button>
</div>
<div class="modal-body">
@if (_failure is not null)
{
<div class="alert alert-danger">
@_failureMessage
<button class="btn btn-sm btn-outline-danger ms-2" @onclick="RetryRootLoad">Retry</button>
</div>
}
<div class="opcua-browser-tree">
<!-- Task 16 fills this in -->
</div>
<hr />
<div class="input-group">
<span class="input-group-text">Manual node id:</span>
<input class="form-control" @bind="_manualNodeId" placeholder="ns=2;s=..." />
<button class="btn btn-outline-secondary" @onclick="UseManual" disabled="@string.IsNullOrWhiteSpace(_manualNodeId)">Use</button>
</div>
</div>
<div class="modal-footer">
<span class="me-auto text-muted">Selected: <code>@(_selectedNodeId ?? "(none)")</code></span>
<button class="btn btn-secondary" @onclick="Cancel">Cancel</button>
<button class="btn btn-primary" @onclick="Confirm" disabled="@string.IsNullOrWhiteSpace(_selectedNodeId)">Select</button>
</div>
</div>
</div>
</div>
}
@code {
[Parameter] public string SiteId { get; set; } = "";
[Parameter] public int DataConnectionId { get; set; }
[Parameter] public string ConnectionName { get; set; } = "";
[Parameter] public string? InitialNodeId { get; set; }
[Parameter] public EventCallback<string> OnSelected { get; set; }
[Parameter] public EventCallback OnCancelled { get; set; }
private bool _isVisible;
private string? _selectedNodeId;
private string _manualNodeId = "";
private BrowseFailure? _failure;
private string _failureMessage = "";
public async Task ShowAsync()
{
_isVisible = true;
_manualNodeId = InitialNodeId ?? "";
_selectedNodeId = InitialNodeId;
await LoadRootAsync();
}
private async Task LoadRootAsync()
{
// Task 16
}
private Task RetryRootLoad() => LoadRootAsync();
private void UseManual()
{
_selectedNodeId = _manualNodeId.Trim();
}
private async Task Confirm()
{
_isVisible = false;
if (!string.IsNullOrWhiteSpace(_selectedNodeId))
await OnSelected.InvokeAsync(_selectedNodeId!);
}
private async Task Cancel()
{
_isVisible = false;
await OnCancelled.InvokeAsync();
}
}