@page "/admin/data-connections" @using ScadaLink.Security @using ScadaLink.Commons.Entities.Sites @using ScadaLink.Commons.Interfaces.Repositories @attribute [Authorize(Policy = AuthorizationPolicies.RequireAdmin)] @inject ISiteRepository SiteRepository @inject NavigationManager NavigationManager

Data Connections

@if (_loading) { } else if (_errorMessage != null) {
@_errorMessage
} else { @* Assignment form *@ @if (_showAssignForm) {
Assign Connection to Site
@if (_assignError != null) {
@_assignError
}
}
@if (_connections.Count == 0) { } @foreach (var conn in _connections) { }
ID Name Protocol Configuration Assigned Sites Actions
No data connections configured.
@conn.Id @conn.Name @conn.Protocol @(conn.Configuration ?? "—") @{ var assignedSites = _connectionSites.GetValueOrDefault(conn.Id); } @if (assignedSites != null && assignedSites.Count > 0) { @foreach (var assignment in assignedSites) { var siteName = _sites.FirstOrDefault(s => s.Id == assignment.SiteId)?.Name ?? $"Site {assignment.SiteId}"; @siteName } } else { None }
}
@code { private List _connections = new(); private List _sites = new(); private Dictionary> _connectionSites = new(); private bool _loading = true; private string? _errorMessage; private bool _showAssignForm; private int _assignConnectionId; private int _assignSiteId; private string? _assignError; private ToastNotification _toast = default!; private ConfirmDialog _confirmDialog = default!; protected override async Task OnInitializedAsync() { await LoadDataAsync(); } private async Task LoadDataAsync() { _loading = true; _errorMessage = null; try { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); _connections = (await SiteRepository.GetAllDataConnectionsAsync()).ToList(); // Load site assignments for each connection _connectionSites.Clear(); foreach (var site in _sites) { var siteConns = await SiteRepository.GetDataConnectionsBySiteIdAsync(site.Id); foreach (var conn in siteConns) { if (!_connectionSites.ContainsKey(conn.Id)) _connectionSites[conn.Id] = new List(); var assignment = await SiteRepository.GetSiteDataConnectionAssignmentAsync(site.Id, conn.Id); if (assignment != null) _connectionSites[conn.Id].Add(assignment); } } } catch (Exception ex) { _errorMessage = $"Failed to load data: {ex.Message}"; } _loading = false; } private async Task DeleteConnection(DataConnection conn) { var confirmed = await _confirmDialog.ShowAsync( $"Delete data connection '{conn.Name}'?", "Delete Connection"); if (!confirmed) return; try { await SiteRepository.DeleteDataConnectionAsync(conn.Id); await SiteRepository.SaveChangesAsync(); _toast.ShowSuccess($"Connection '{conn.Name}' deleted."); await LoadDataAsync(); } catch (Exception ex) { _toast.ShowError($"Delete failed: {ex.Message}"); } } private void ShowAssignForm() { _assignConnectionId = 0; _assignSiteId = 0; _assignError = null; _showAssignForm = true; } private void CancelAssignForm() { _showAssignForm = false; _assignError = null; } private async Task SaveAssignment() { _assignError = null; if (_assignConnectionId == 0) { _assignError = "Select a connection."; return; } if (_assignSiteId == 0) { _assignError = "Select a site."; return; } try { var assignment = new SiteDataConnectionAssignment { SiteId = _assignSiteId, DataConnectionId = _assignConnectionId }; await SiteRepository.AddSiteDataConnectionAssignmentAsync(assignment); await SiteRepository.SaveChangesAsync(); _showAssignForm = false; _toast.ShowSuccess("Connection assigned to site."); await LoadDataAsync(); } catch (Exception ex) { _assignError = $"Assignment failed: {ex.Message}"; } } private async Task RemoveAssignment(SiteDataConnectionAssignment assignment) { try { await SiteRepository.DeleteSiteDataConnectionAssignmentAsync(assignment.Id); await SiteRepository.SaveChangesAsync(); _toast.ShowSuccess("Assignment removed."); await LoadDataAsync(); } catch (Exception ex) { _toast.ShowError($"Remove failed: {ex.Message}"); } } }